/ Hex Artifact Content
Login

Artifact 4d5cdfeaea4a00f796c17af246dd5b48cd525d5e:


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 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
66e0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
66f0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
6700: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6710: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
6720: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6730: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6740: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6750: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6760: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6770: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6780: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6790: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
67a0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
67b0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
67c0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
67d0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
67e0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
67f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
6800: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
6810: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
6820: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6830: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6840: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6850: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6860: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6870: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6880: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6890: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
68a0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
68b0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
68c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
68d0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
68e0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
68f0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
6900: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
6910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6920: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6940: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6950: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6960: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6970: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6980: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6990: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
69a0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
69b0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
69c0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
69d0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
69e0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
69f0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6a00: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6a10: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6a20: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6a30: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6a40: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6a50: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6a60: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6a70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6a80: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6aa0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6ab0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ac0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6ad0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6ae0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6af0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6b00: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6b10: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6b20: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6b30: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6b40: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6b50: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6b60: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6b70: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6b80: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6b90: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6ba0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6bb0: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6bc0: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6bd0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6be0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6bf0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6c00: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6c10: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6c20: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6c30: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6c40: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6c50: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6c60: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6c70: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6c80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6c90: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6ca0: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6cb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6cc0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6cd0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6ce0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6cf0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6d00: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6d10: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6d40: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6d50: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6d60: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6d70: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6d80: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6d90: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6da0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6df0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6e00: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6e10: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6e20: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6e30: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6e40: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6e50: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6e60: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6e70: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6e80: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6e90: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6ea0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6eb0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6ec0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6ee0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6ef0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6f00: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6f10: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6f20: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6f30: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6f40: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6f50: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6f70: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6f80: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6fa0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
6fb0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
6fc0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
6fd0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
6fe0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
6ff0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7000: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7010: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7020: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7030: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7040: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7050: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7060: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7070: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7080: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7090: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
70a0: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
70b0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
70c0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
70d0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
70e0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
70f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
7100: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
7110: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7120: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7130: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7140: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7150: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7160: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7170: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7180: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7190: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
71a0: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
71b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
71c0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
71d0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
71e0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
71f0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7200: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7210: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7220: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7230: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7240: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7250: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7260: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7270: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7280: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7290: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
72a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
72b0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
72c0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
72d0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
72e0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
72f0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7300: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7310: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7320: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7330: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7340: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7350: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7360: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7370: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7380: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7390: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
73a0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
73b0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
73c0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
73d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
73e0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
73f0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7400: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7410: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7420: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7430: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7440: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7450: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7460: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7470: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7480: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7490: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
74a0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
74b0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
74c0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
74d0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
74e0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
74f0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
7500: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
7510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7520: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7530: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7540: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7550: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7560: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7570: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7580: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7590: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
75a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
75b0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
75c0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
75d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
75e0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
75f0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7600: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
7610: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
7620: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7630: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7640: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7650: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7660: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7670: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7680: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7690: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
76a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
76b0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
76c0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
76d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
76e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
76f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7700: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7710: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7720: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7730: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7740: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7750: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7760: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7780: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7790: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
77a0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
77b0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
77c0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
77d0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
77e0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
77f0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
7800: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
7810: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7820: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7830: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7840: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7850: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7860: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7870: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7880: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7890: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
78a0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
78b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
78c0: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
78d0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
78e0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
78f0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
7900: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
7910: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7920: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7930: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7940: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7950: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7960: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7970: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7980: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7990: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
79a0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
79b0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
79c0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
79d0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
79e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
79f0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7a00: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7a10: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7a20: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7a30: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7a40: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7a50: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7a60: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7a70: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7a80: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7a90: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7aa0: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7ab0: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7ac0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7ad0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7ae0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7af0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7b00: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7b10: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7b20: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7b30: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7b40: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7b50: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7b60: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7b70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7b80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7b90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7ba0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7bb0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7bc0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7bd0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7be0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7bf0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7c00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7c10: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7c20: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7c30: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7c40: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7c60: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7c70: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7c80: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7c90: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7ca0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7cb0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7cc0: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7cd0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7ce0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7cf0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7d00: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7d10: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7d20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7d30: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7d40: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7d50: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7d60: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7d70: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7d80: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7db0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7dc0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7dd0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7de0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7df0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7e00: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7e10: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7e20: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7e30: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7e40: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7e50: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7e60: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7e70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7e80: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7e90: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7ea0: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7eb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7ec0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7ed0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7ee0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7ef0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7f00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7f10: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7f20: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
7f30: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
7f40: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
7f50: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
7f60: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
7f70: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
7f80: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
7f90: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
7fa0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7fb0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
7fc0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
7fd0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
7ff0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
8000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8010: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8020: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8030: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8040: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8050: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8060: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8070: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8080: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8090: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
80a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
80b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
80c0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
80d0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
80e0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
80f0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
8100: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
8110: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8120: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8130: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8140: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8150: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8160: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8170: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8180: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8190: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
81a0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
81b0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
81c0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
81d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
81e0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
81f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8200: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
8210: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
8220: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8230: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8240: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8250: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8260: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8270: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8280: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8290: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
82a0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
82b0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
82c0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
82d0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
82e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
82f0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
8300: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
8310: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8320: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8330: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8340: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8350: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8360: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8370: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8380: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8390: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
83a0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
83b0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
83c0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
83d0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
83e0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
83f0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
8400: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
8410: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8420: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8430: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8440: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8450: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8460: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8470: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8480: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8490: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
84a0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
84b0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
84c0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
84d0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
84e0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
84f0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
8500: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
8510: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8520: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8530: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8540: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8550: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8560: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8570: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8580: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8590: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
85a0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
85b0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
85c0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
85d0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
85e0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
85f0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8600: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
8610: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8620: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8630: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8660: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8670: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8680: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8690: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
86a0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
86b0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
86c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
86d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
86e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
86f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8700: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8710: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
8720: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8730: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8740: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8750: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8760: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8770: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8780: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8790: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
87a0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
87b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
87c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
87d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
87e0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8800: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
8810: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
8820: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8830: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8840: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8850: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8860: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8870: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8880: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8890: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
88a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
88b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
88c0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
88d0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
88e0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
88f0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
8900: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
8910: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
8920: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8930: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8940: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8950: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8960: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8970: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8980: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8990: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
89a0: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
89b0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
89c0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
89d0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
89e0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
89f0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8a00: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8a10: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a40: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8a50: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8a60: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8a90: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8aa0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8ab0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8ac0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8ae0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8af0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8b00: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8b10: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8b20: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8b30: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8b40: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8b50: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8b60: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8b70: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8b80: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8b90: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8ba0: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8bb0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8bc0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8bd0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8be0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8bf0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8c00: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8c10: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8c20: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8c30: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8c40: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8c50: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8c60: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8c80: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8c90: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8ca0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8cb0: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8cc0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8cd0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8ce0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8cf0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8d00: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8d10: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8d20: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8d30: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8d40: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8d50: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8d60: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8d70: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8d80: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8d90: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8da0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8db0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8dc0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8dd0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8de0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8df0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8e00: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8e10: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8e20: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8e30: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8e40: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8e50: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8e60: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8e70: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8e80: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8e90: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8ea0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8eb0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8ec0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8ed0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8ee0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8ef0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8f00: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8f10: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8f20: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
8f30: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
8f40: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
8f50: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
8f60: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8f70: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
8f80: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
8f90: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
8fa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8fb0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8fc0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8fd0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
8fe0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8ff0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9000: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9010: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9030: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9040: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9050: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9060: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9070: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9080: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9090: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
90a0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
90b0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
90c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
90d0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
90e0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
90f0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
9100: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
9110: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9120: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9130: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9140: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9150: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9160: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9170: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9180: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9190: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
91a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
91b0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
91c0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
91d0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
91e0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
91f0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9200: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
9210: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
9220: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9230: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9240: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9260: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9270: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9280: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9290: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
92a0: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
92b0: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
92c0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
92d0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
92e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
92f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
9300: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
9310: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
9320: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9330: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9340: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9350: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9360: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9370: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9380: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9390: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
93a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
93b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
93c0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
93d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
93e0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
93f0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
9400: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
9410: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9420: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9430: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9440: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9450: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9460: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9470: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
9480: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
9490: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
94a0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
94d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
94e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
94f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9500: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
9510: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
9540: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
9550: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
9580: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
9590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
95a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
95b0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
95c0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
95d0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
95e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
95f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
9600: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
9610: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
9620: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9630: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
9640: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9650: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
9660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9670: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
9680: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
9690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
96a0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
96b0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
96c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
96d0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
96e0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
96f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
9700: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
9710: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
9720: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
9730: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
9740: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
9750: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
9760: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
9770: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
9780: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9790: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
97a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
97b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
97c0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
97d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
97e0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
97f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9800: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9810: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
9820: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9830: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9840: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9850: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
9860: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
9870: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
9880: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
9890: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
98a0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
98b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
98c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
98d0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
98e0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
98f0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9900: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9910: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9920: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9930: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9940: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
9950: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9960: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
9970: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
9980: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
9990: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
99a0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
99b0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
99c0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
99d0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
99e0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
99f0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
9a00: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
9a10: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
9a20: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
9a30: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
9a40: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
9a50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
9a60: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
9a70: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
9a80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
9a90: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
9aa0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
9ab0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
9ac0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9ad0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9ae0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9af0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9b00: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9b10: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9b20: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9b30: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9b40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9b50: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9b60: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9b70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
9b80: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
9b90: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
9ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9bb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9bc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9bd0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
9be0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9bf0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9c00: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9c10: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9c20: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9c30: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9c40: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c50: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c60: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9c70: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
9c80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9c90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9ca0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
9cb0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9cc0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
9cd0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9d00: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9d10: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9d20: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9d30: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9d40: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9d50: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9d60: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9d70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9d80: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
9d90: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
9da0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
9db0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
9dc0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
9dd0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9de0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9df0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9e00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9e10: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9e20: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9e30: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9e40: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9e50: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9e60: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9e70: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
9e80: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
9e90: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9ea0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9eb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
9ec0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
9ed0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9ee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9ef0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9f00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9f10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9f20: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9f30: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9f40: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9f50: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9f60: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9f70: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9f80: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9f90: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9fa0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9fb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9fc0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9fd0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9fe0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9ff0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
a000: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
a010: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
a020: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
a030: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
a040: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
a050: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
a060: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
a070: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a080: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
a090: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
a0a0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
a0b0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
a0c0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
a0d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
a0e0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
a0f0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
a100: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
a110: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
a120: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
a130: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
a140: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
a150: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
a160: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
a170: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
a180: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
a190: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
a1a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
a1b0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
a1c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
a1d0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
a1e0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
a1f0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
a200: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
a210: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
a220: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
a230: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
a240: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
a250: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
a260: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
a270: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
a280: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a2b0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
a2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
a2d0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
a2e0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
a2f0: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
a300: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
a310: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
a320: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
a330: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
a340: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
a350: 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
a360: 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68  sable size of th
a370: 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61  e page */.  .  a
a380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a390: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a3a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a3b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a3c0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
a3d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a3e0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a3f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a400: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
a410: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
a420: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
a430: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a440: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
a450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a460: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
a470: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
a480: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
a490: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  ableSize;.  asse
a4a0: 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62  rt( nByte < usab
a4b0: 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 61  leSize-8 );..  a
a4c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
a4d0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
a4e0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
a4f0: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
a500: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
a510: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
a520: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
a530: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 74 6f  p<=65536 );.  to
a540: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
a550: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
a560: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
a570: 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b 0a 20   if( top==0 ){. 
a580: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
a590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a5a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a5b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a5c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
a5d0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
a5e0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
a5f0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
a600: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
a610: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
a620: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
a630: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
a640: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
a650: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
a660: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
a670: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
a680: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
a690: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
a6a0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
a6b0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
a6c0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
a6d0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
a6e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
a6f0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
a700: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20 28   gap+2<=top && (
a710: 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20 64  data[hdr+1] || d
a720: 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a 20  ata[hdr+2]) ){. 
a730: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
a740: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
a750: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
a760: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
a770: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
a780: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20       int size;  
a790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a7a0: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a7b0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
a7c0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
a7d0: 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a  || pc<addr+4 ){.
a7e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a7f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a800: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
a810: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
a820: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
a830: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
a840: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a850: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a860: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74  nByte;.        t
a870: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a880: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a890: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
a8a0: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
a8b0: 20 20 20 20 20 20 20 20 69 66 28 20 64 61 74 61          if( data
a8c0: 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29 20 67 6f  [hdr+7]>=60 ) go
a8d0: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  to defragment_pa
a8e0: 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;.          /*
a8f0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
a900: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
a910: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
a920: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
a930: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
a940: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
a950: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
a960: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
a970: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
a980: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
a990: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b     data[hdr+7] +
a9a0: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 20  = (u8)x;.       
a9b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b   }else if( size+
a9c0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
a9d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a9f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
aa00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa10: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
aa20: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
aa30: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
aa40: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
aa50: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
aa60: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
aa70: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa80: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa90: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
aaa0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
aac0: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
aad0: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
aae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
aaf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ab00: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
ab10: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
ab20: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
ab30: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
ab40: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
ab50: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
ab60: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
ab70: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
ab80: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
ab90: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
aba0: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
abb0: 29 7b 0a 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  ){.defragment_pa
abc0: 67 65 3a 0a 20 20 20 20 74 65 73 74 63 61 73 65  ge:.    testcase
abd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
abe0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  0 );.    rc = de
abf0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
ac00: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
ac10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
ac20: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
ac30: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
ac40: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
ac50: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
ac60: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
ac70: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
ac80: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
ac90: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
aca0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
acb0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
acc0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
acd0: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
ace0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
acf0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
ad00: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
ad10: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
ad20: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
ad30: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
ad40: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
ad50: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
ad60: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
ad70: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ad80: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
ad90: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
ada0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
adb0: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
adc0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
add0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ade0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
adf0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
ae00: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
ae10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ae20: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
ae30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ae40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
ae50: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
ae60: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
ae70: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
ae80: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
ae90: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
aea0: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
aeb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
aec0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
aed0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
aee0: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
aef0: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
af00: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
af10: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
af20: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
af30: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
af40: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
af50: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
af60: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
af70: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
af80: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
af90: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
afa0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
afb0: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
afc0: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
afd0: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
afe0: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
aff0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
b000: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
b010: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
b020: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
b030: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
b040: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
b050: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
b060: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
b070: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
b080: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
b090: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
b0a0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
b0b0: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
b0c0: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
b0d0: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b100: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
b110: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
b120: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b150: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
b160: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b190: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
b1a0: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
b1b0: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
b1e0: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
b1f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
b200: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
b210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b220: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
b230: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
b240: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
b250: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b260: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
b270: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
b280: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b290: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
b2a0: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
b2b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b2c0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
b2d0: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
b2e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b2f0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b300: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
b310: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
b320: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b330: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b340: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b350: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b360: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b370: 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50 61  ert( iStart>=pPa
b380: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
b390: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b3a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
b3b0: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
b3c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b3e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b3f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b400: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b410: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
b420: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
b430: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
b440: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
b450: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
b460: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
b470: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
b480: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
b490: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
b4a0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
b4b0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
b4c0: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
b4d0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
b4e0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
b4f0: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
b500: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
b510: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
b520: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
b530: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
b540: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
b550: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
b560: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
b570: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
b580: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
b590: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b5a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
b5b0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
b5c0: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
b5d0: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
b5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
b5f0: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
b600: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
b610: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
b620: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
b630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
b640: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
b650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b660: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
b670: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
b680: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
b690: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
b6a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b6b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
b6c0: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
b6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
b6e0: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
b6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b700: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
b710: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
b720: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
b730: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
b740: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
b750: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
b760: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
b770: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
b780: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
b790: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
b7a0: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
b7b0: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
b7c0: 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  r iFreeBlk.    *
b7d0: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
b7e0: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
b7f0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
b800: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
b810: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
b820: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
b830: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
b840: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
b850: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
b860: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
b870: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
b880: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
b890: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b8a0: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
b8b0: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
b8c0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
b8d0: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69  k+2]);.      iSi
b8e0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
b8f0: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
b900: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
b910: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
b920: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b930: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
b940: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
b950: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
b960: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
b970: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
b980: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
b990: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
b9a0: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
b9b0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
b9c0: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
b9d0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
b9e0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
b9f0: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
ba00: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
ba10: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
ba20: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
ba30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
ba40: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
ba50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
ba60: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
ba70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ba80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ba90: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
baa0: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
bab0: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
bac0: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
bad0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
bae0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
baf0: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
bb00: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
bb10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bb20: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
bb30: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
bb40: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
bb50: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
bb60: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
bb70: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
bb80: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
bb90: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
bba0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
bbb0: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
bbc0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
bbd0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
bbe0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
bbf0: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
bc00: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
bc10: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
bc20: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
bc30: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bc40: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
bc50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bc60: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
bc70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bc80: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
bc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
bca0: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
bcb0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
bcc0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
bcd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bce0: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
bcf0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
bd00: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
bd10: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
bd20: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
bd30: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
bd40: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
bd50: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
bd60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bd70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
bd80: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
bd90: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
bda0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
bdb0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
bdc0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
bdd0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
bde0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
bdf0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
be00: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
be10: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
be20: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
be30: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
be40: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
be50: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
be60: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
be70: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
be80: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
be90: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
bea0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
beb0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
bec0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
bed0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
bee0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
bef0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
bf00: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
bf10: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
bf20: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
bf30: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
bf40: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
bf50: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
bf60: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
bf70: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
bf80: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
bf90: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
bfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bfb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bfc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bfd0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
bfe0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
bff0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
c000: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
c010: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
c020: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
c030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
c040: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
c050: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
c060: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
c070: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
c080: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
c090: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
c0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
c0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c0c0: 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e  eyLeaf = pPage->
c0d0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
c0e0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50  >noPayload = !pP
c0f0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
c100: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
c110: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
c120: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
c130: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
c140: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
c150: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
c160: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
c170: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
c180: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
c190: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
c1a0: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
c1b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
c1c0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
c1d0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
c1e0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
c1f0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
c200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
c210: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c220: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
c230: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
c240: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
c250: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
c260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c280: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
c290: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
c2a0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
c2b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
c2c0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c2d0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
c2e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
c2f0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
c300: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
c310: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
c320: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
c330: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
c340: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
c350: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
c360: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
c370: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
c380: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
c390: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
c3a0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
c3b0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
c3c0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
c3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c3e0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
c3f0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
c400: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c410: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c420: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c430: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c440: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
c450: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
c460: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
c470: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
c480: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c490: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
c4a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c4b0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c4c0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c4d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
c4e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c4f0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c500: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
c510: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c520: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
c530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
c540: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
c550: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
c560: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
c570: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
c580: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
c590: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
c5a0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
c5b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
c5c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
c5d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
c5e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
c600: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
c610: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
c620: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
c630: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
c640: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
c650: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
c660: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
c670: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
c680: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
c690: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
c6a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
c6b0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
c6c0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
c6d0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
c6e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
c6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c700: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c710: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
c720: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
c730: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
c740: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
c750: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
c760: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
c770: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
c780: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
c790: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
c7a0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
c7b0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
c7c0: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
c7d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c7e0: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
c7f0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
c800: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
c810: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
c820: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
c830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c840: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
c850: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c860: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c870: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
c880: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
c890: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
c8a0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
c8b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
c8c0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
c8d0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
c8e0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
c8f0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
c900: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
c910: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
c920: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
c930: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
c940: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
c950: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
c960: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
c970: 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d  fset];.    top =
c980: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
c990: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c9a0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
c9b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c9c0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
c9d0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
c9e0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
c9f0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
ca00: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
ca10: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
ca20: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
ca30: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
ca40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
ca60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
ca70: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
ca80: 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  LL(pBt) );..    
ca90: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
caa0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
cab0: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
cac0: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
cad0: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
cae0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
caf0: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
cb00: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
cb10: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
cb20: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
cb30: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
cb40: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
cb50: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
cb60: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
cb70: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
cb80: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
cb90: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
cba0: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
cbb0: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
cbc0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
cbd0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
cbe0: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
cbf0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
cc00: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
cc10: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
cc20: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
cc30: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
cc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cc50: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
cc60: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
cc70: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
cc80: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
cc90: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
cca0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
ccb0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ccc0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
ccd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
cce0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
ccf0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
cd00: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
cd10: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
cd20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
cd30: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
cd40: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
cd50: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
cd60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
cd70: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
cd80: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
cd90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
cda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cdb0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
cdc0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
cdd0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
cde0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
cdf0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
ce00: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
ce10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ce20: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
ce30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
ce40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ce50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
ce60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ce70: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
ce80: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
ce90: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
cea0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
ceb0: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
cec0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
ced0: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
cee0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
cef0: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
cf00: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
cf10: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
cf20: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
cf30: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
cf40: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
cf50: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
cf60: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
cf70: 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65  /* Start of free
cf80: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
cf90: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
cfa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cfb0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
cfc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
cfd0: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
cfe0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
cff0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
d000: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
d010: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
d020: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
d030: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
d040: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
d050: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
d060: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
d070: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
d080: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
d090: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
d0a0: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
d0b0: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
d0c0: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
d0d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d0e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d0f0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
d100: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
d110: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
d120: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
d130: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d140: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
d150: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
d160: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
d170: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
d180: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
d190: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
d1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
d1b0: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
d1c0: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
d1d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
d1e0: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
d1f0: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
d200: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
d210: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
d220: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
d230: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
d240: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
d250: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
d260: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
d270: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
d280: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
d290: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
d2a0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
d2b0: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
d2c0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d2d0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
d2e0: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
d2f0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
d300: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d310: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
d320: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
d330: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
d340: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
d350: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d360: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
d370: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d380: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
d390: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
d3a0: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
d3b0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
d3c0: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
d3d0: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
d3e0: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
d3f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
d400: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
d410: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
d420: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
d430: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d440: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
d450: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
d460: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
d470: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
d480: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d490: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
d4a0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
d4b0: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d4d0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
d4e0: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
d4f0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
d500: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d510: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d520: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d540: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d550: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d560: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d570: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d580: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d590: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
d5a0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
d5b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
d5c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
d5d0: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
d5e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
d5f0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
d600: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
d610: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
d620: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
d630: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
d640: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
d650: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
d660: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
d670: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
d680: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
d690: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
d6a0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
d6b0: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
d6c0: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
d6d0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
d6e0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
d6f0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d700: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
d710: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
d720: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
d730: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
d740: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
d750: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
d760: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d770: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
d780: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
d790: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
d7a0: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
d7b0: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d7c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d7d0: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
d7e0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
d7f0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
d800: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
d810: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
d820: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d830: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
d840: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
d850: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
d860: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
d870: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
d880: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
d890: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
d8a0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d8b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
d8c0: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
d8d0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d8e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
d8f0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
d900: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d910: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
d920: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
d930: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
d940: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
d950: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
d960: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d970: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
d980: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
d990: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
d9a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d9b0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d9c0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
d9d0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
d9e0: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
d9f0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
da00: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
da10: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
da20: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
da30: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
da40: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
da50: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
da60: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
da70: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
da80: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
da90: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
daa0: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
dab0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
dac0: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
dad0: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
dae0: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
daf0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
db00: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
db10: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
db20: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
db30: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
db40: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
db50: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
db60: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
db70: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
db80: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
db90: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
dba0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
dbb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
dbc0: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
dbd0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
dbe0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
dbf0: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
dc00: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
dc10: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
dc20: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
dc30: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
dc40: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
dc50: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
dc60: 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
dc70: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
dc80: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
dc90: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
dca0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
dcb0: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
dcc0: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
dcd0: 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
dce0: 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
dcf0: 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
dd00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dd10: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
dd20: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
dd30: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
dd40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
dd50: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
dd60: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
dd70: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
dd80: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
dd90: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
dda0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
ddb0: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
ddc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ddd0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
dde0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
ddf0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
de00: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
de10: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
de20: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
de30: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
de40: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
de50: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
de60: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
de70: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
de80: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
de90: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
dea0: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
deb0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
dec0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
ded0: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
dee0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
def0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
df00: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
df10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
df20: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
df30: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
df40: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
df50: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
df60: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
df70: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
df80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
df90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
dfa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
dfb0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
dfc0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
dfd0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
dfe0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
dff0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
e000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
e010: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
e020: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
e030: 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
e040: 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
e050: 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
e060: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
e070: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
e080: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
e0a0: 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
e0b0: 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
e0c0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
e0d0: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
e0e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
e0f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
e100: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
e110: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
e120: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
e130: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
e140: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
e150: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
e160: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
e170: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
e180: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
e190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e1a0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
e1b0: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
e1c0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
e1d0: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
e1e0: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
e1f0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
e200: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
e210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e220: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
e230: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e260: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
e270: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e290: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
e2a0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
e2b0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e2d0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
e2e0: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
e2f0: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
e320: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
e330: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
e340: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e350: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e360: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e370: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
e380: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
e390: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
e3a0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
e3b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
e3c0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
e3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e3e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
e3f0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
e400: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
e410: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
e420: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e430: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
e440: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
e450: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
e460: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
e470: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
e480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e490: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
e4a0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
e4b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e4c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
e4d0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
e4e0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
e4f0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
e500: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e510: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
e520: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
e530: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
e540: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
e550: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
e560: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
e570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
e580: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
e590: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
e5a0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
e5b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
e5c0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
e5d0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
e5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e5f0: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
e600: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
e610: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
e620: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
e630: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
e640: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
e650: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
e660: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e670: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
e680: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
e690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e6a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e6b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
e6c0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
e6d0: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
e6e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
e6f0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
e700: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
e710: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
e720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
e730: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
e740: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
e750: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
e760: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
e770: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
e780: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
e790: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
e7a0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
e7b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e7c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
e7d0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
e7e0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
e7f0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
e800: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e810: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
e820: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
e830: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
e840: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
e850: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
e860: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
e870: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
e880: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
e890: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
e8a0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
e8b0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
e8c0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
e8d0: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
e8e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e8f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e900: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e910: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e920: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
e930: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
e940: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
e950: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
e960: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
e970: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
e980: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
e990: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
e9a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
e9b0: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
e9c0: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
e9d0: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
e9e0: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
e9f0: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
ea00: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
ea10: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
ea20: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
ea30: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
ea40: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
ea50: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
ea60: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
ea70: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
ea80: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
ea90: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
eaa0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
eab0: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
eac0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
ead0: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
eae0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
eaf0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
eb00: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
eb10: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
eb20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
eb30: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
eb40: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
eb50: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
eb60: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
eb70: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
eb80: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
eb90: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
eba0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
ebb0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
ebc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ebd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ebe0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
ebf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
ec00: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ec10: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
ec20: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
ec30: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
ec40: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
ec50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
ec60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
ec70: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
ec80: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
ec90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
eca0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ecb0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
ecc0: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
ecd0: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
ece0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
ecf0: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
ed00: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
ed10: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
ed20: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
ed30: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
ed40: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
ed50: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
ed60: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
ed70: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ed80: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
ed90: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
eda0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
edb0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
edc0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
edd0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
ede0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
edf0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
ee00: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
ee10: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
ee20: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
ee30: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
ee40: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
ee50: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
ee60: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
ee70: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
ee80: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
ee90: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
eea0: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
eeb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
eec0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
eed0: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
eee0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
eef0: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
ef00: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
ef10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
ef20: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
ef30: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
ef40: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
ef50: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
ef60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
ef70: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
ef80: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
ef90: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
efa0: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
efb0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
efc0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
efd0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
efe0: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
eff0: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
f000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f010: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
f020: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
f030: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
f040: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
f050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f060: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
f070: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
f080: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
f090: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
f0a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f0b0: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
f0c0: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
f0d0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0f0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
f100: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
f110: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
f120: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
f130: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
f140: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
f150: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
f160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
f170: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
f180: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
f190: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
f1c0: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
f1d0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
f1e0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
f1f0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
f200: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
f210: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
f220: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f230: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f240: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
f250: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
f260: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f280: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
f290: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
f2a0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
f2b0: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
f2c0: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
f2d0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
f2e0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
f2f0: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
f300: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
f310: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
f320: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
f330: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
f340: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
f350: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
f360: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
f370: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
f380: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
f390: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
f3a0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
f3b0: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
f3c0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
f3d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f3e0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
f3f0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
f400: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
f410: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
f420: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
f430: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
f440: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
f470: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
f480: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
f4b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
f4c0: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
f4d0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
f4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
f4f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f500: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f510: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
f520: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
f530: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
f540: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
f550: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
f560: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
f570: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
f580: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
f590: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
f5a0: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
f5b0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
f5c0: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
f5d0: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
f5e0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
f5f0: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
f600: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
f610: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
f620: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
f630: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
f640: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
f650: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
f660: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
f670: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
f680: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
f690: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
f6a0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
f6b0: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
f6c0: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
f6d0: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
f6e0: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
f6f0: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
f700: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
f710: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
f720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
f730: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
f740: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
f750: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f770: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
f780: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
f790: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
f7a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f7b0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
f7c0: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
f7d0: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
f7e0: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
f7f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f800: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f810: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f830: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
f840: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
f850: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
f860: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
f870: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
f880: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
f890: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
f8a0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
f8b0: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
f8c0: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
f8d0: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
f8e0: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
f8f0: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
f900: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
f910: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
f920: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
f930: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
f940: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
f950: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
f960: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
f970: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
f980: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
f990: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
f9a0: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
f9b0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f9c0: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
f9d0: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f9e0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
f9f0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
fa00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
fa10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fa20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fa40: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
fa50: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
fa60: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
fa70: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
fa80: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
fa90: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
faa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
fab0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
fac0: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
fad0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
fb00: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
fb10: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
fb20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
fb30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fb40: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
fb50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fb60: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
fb70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb90: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
fba0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
fbb0: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
fbc0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
fbd0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
fbe0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
fbf0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
fc00: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
fc10: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
fc20: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
fc30: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
fc40: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
fc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
fc60: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
fc70: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
fc80: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
fc90: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
fca0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
fcb0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
fcc0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
fcd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
fce0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
fcf0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
fd00: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
fd10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
fd20: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
fd30: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
fd40: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
fd50: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
fd60: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
fd70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fd80: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
fd90: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
fda0: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
fdc0: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
fdd0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
fde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
fdf0: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
fe00: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
fe10: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
fe20: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fe30: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
fe40: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
fe50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fe60: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
fe70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
fe80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fe90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
feb0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
fed0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
fee0: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
fef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
ff00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
ff10: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
ff20: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
ff30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ff40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
ff60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ff70: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ff80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
ff90: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ffa0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
ffb0: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
ffc0: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
ffd0: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
ffe0: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
fff0: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
10000 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
10010 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
10020 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
10030 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
10040 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
10050 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
10060 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
10070 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
10080 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
10090 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
100a0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
100b0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
100c0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
100d0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
100e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
100f0 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
10100 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
10110 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10120 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
10130 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
10140 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
10150 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
10160 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
10170 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
10180 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
10190 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
101a0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
101b0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
101c0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
101d0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
101e0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
101f0 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10200 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
10210 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10220 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10230 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
10240 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10250 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
10260 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
10270 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
10280 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
10290 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
102a0 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
102b0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
102c0 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
102d0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
102e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
102f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
10300 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10310 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10320 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
10330 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
10340 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
10370 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
10380 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
10390 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
103a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
103b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
103c0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
103d0 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
103e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
103f0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
10400 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
10410 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
10420 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
10430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10450 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
10460 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10470 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
10480 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
10490 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
104a0 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
104b0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
104c0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
104d0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
104e0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
104f0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
10500 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
10510 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
10520 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10530 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10540 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
10550 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
10560 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10570 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
10580 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
10590 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
105a0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
105b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
105c0 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
105d0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
105e0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
105f0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
10600 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
10610 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
10620 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
10630 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10640 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
10650 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
10660 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
10670 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
10680 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
10690 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
106a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
106b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
106c0 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
106d0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
106e0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
106f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
10700 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
10710 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
10720 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
10730 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
10740 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
10750 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
10760 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
10770 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10780 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
10790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
107a0 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
107b0 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
107c0 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
107d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
107e0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
107f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
10800 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
10810 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
10820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10830 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10840 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
10850 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
10860 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
10870 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10880 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
10890 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
108a0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
108b0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
108c0 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
108d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
108e0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
108f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10900 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
10910 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
10920 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
10930 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
10940 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
10950 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10960 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
10970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10980 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
10990 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
109a0 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
109b0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
109c0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
109d0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
109e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
109f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10a00 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10a10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
10a20 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
10a30 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
10a40 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
10a50 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
10a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
10a70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
10a80 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
10a90 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
10aa0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
10ab0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
10ac0 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
10ad0 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
10ae0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10af0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10b00 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10b10 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10b20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
10b30 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
10b40 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
10b50 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
10b60 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
10b70 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
10b80 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
10b90 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
10ba0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
10bb0 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
10bc0 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
10bd0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
10be0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10bf0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10c00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10c10 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
10c20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10c30 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
10c40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
10c50 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
10c60 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
10c70 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
10c80 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10c90 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
10ca0 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
10cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10cd0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
10ce0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
10cf0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
10d00 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10d10 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
10d20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10d30 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
10d40 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
10d50 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
10d60 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10d70 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10d80 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
10d90 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10da0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10db0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
10dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10dd0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
10de0 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
10df0 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
10e00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10e10 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
10e20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
10e30 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
10e40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
10e50 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
10e60 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
10e70 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
10e80 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
10e90 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
10ea0 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
10eb0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
10ec0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
10ed0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
10ee0 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
10ef0 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
10f00 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
10f10 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
10f20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
10f30 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
10f40 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10f50 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
10f60 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
10f70 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
10f80 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
10f90 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
10fa0 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
10fb0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
10fc0 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
10fd0 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
10fe0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10ff0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
11000 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
11010 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
11020 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
11030 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
11040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
11050 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
11060 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
11070 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
11080 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
11090 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
110a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
110b0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
110c0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
110d0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
110e0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
110f0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
11100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11110 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
11120 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
11130 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
11140 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
11150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
11160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11170 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
11180 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
11190 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
111a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
111b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
111c0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
111d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
111e0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
111f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
11200 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11210 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
11220 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
11230 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
11240 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
11250 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
11260 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
11270 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
11280 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
11290 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
112a0 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
112b0 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
112c0 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
112d0 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
112e0 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
112f0 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
11300 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
11310 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
11320 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
11330 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
11340 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11350 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
11360 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
11370 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
11380 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
11390 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
113a0 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
113b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
113c0 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
113d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
113e0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
113f0 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
11400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11410 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
11420 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
11430 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
11440 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
11450 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
11460 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
11470 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
11480 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
11490 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
114a0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
114b0 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
114c0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
114d0 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
114e0 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
114f0 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
11500 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11510 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11530 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11540 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
11550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
11560 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
11570 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
11580 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
11590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
115a0 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
115b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
115c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
115d0 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
115e0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
115f0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
11600 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
11610 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11620 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
11630 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
11640 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
11650 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
11660 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11670 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
11680 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
11690 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
116a0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
116b0 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
116c0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
116d0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
116e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
116f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11700 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
11710 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
11720 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
11730 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
11740 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
11750 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11760 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
11770 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
11780 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
11790 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
117a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
117b0 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
117c0 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
117d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
117e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
117f0 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
11800 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
11810 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
11820 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11830 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
11840 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11850 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
11860 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
11870 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
11880 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
11890 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
118a0 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
118b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
118c0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
118d0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
118e0 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
118f0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
11900 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
11910 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
11920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
11930 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
11940 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
11950 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
11960 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
11970 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
11980 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
11990 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
119a0 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
119b0 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
119c0 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
119d0 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
119e0 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
119f0 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
11a00 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
11a10 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
11a20 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
11a30 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
11a40 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
11a50 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
11a60 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
11a70 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
11a80 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
11a90 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
11aa0 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
11ab0 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
11ac0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
11ad0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
11ae0 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
11af0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
11b00 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
11b10 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
11b20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
11b30 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
11b40 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
11b50 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
11b60 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
11b70 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
11b80 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
11b90 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
11ba0 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
11bb0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
11bc0 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
11bd0 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ere.  */.    if(
11be0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11bf0 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54  ) memset(pBt->pT
11c00 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a  mpSpace, 0, 4);.
11c10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
11c20 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
11c30 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
11c40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11c50 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
11c60 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
11c70 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
11c80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
11c90 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
11ca0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
11cb0 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
11cc0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
11cd0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
11ce0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11cf0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
11d00 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
11d10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11d20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
11d30 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
11d40 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
11d50 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
11d60 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
11d70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11d80 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11d90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11da0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
11db0 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
11dc0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
11dd0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
11de0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
11df0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
11e00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
11e10 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
11e20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e30 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
11e40 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
11e50 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
11e60 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
11e70 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
11e80 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
11e90 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
11ea0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
11eb0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
11ec0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
11ed0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
11ee0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
11ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
11f00 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
11f10 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
11f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11f30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11f40 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
11f50 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
11f60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
11f70 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
11f80 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
11f90 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
11fa0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
11fb0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
11fc0 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
11fd0 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
11fe0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
11ff0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
12000 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
12010 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
12020 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
12030 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
12040 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
12050 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
12060 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
12070 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
12080 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
12090 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
120a0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
120b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
120c0 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
120d0 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
120e0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
120f0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
12100 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
12110 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
12120 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12130 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
12140 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
12150 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
12160 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
12170 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
12180 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12190 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
121a0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
121b0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
121c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
121d0 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
121e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
121f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
12200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
12210 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
12220 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
12230 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
12240 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
12250 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
12260 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
12270 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
12280 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
12290 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
122a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
122b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
122c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
122d0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
122e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
122f0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
12300 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
12310 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
12320 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
12330 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
12340 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
12350 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
12360 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
12370 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
12380 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
12390 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
123a0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
123b0 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
123c0 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
123d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
123e0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
123f0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
12400 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
12410 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
12420 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
12430 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
12440 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
12450 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
12460 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
12470 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
12480 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
12490 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
124a0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
124b0 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
124c0 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
124d0 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
124e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
124f0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
12500 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
12510 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
12520 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
12530 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
12540 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
12550 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
12560 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
12570 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
12580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12590 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
125a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
125b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
125c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
125f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12600 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12610 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12620 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
12630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
12640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12670 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12680 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
12690 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
126a0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
126b0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
126c0 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
126d0 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
126e0 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
126f0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
12700 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
12710 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
12720 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
12730 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12750 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12760 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12780 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12790 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
127a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
127b0 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
127c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
127d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127e0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
127f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
12800 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
12810 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
12820 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
12830 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
12840 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
12850 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
12860 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
12870 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
12880 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
12890 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
128a0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
128b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
128c0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
128d0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
128e0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
128f0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
12900 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
12910 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
12920 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
12930 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
12940 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
12950 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
12960 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
12970 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
12980 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
12990 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
129a0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
129b0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
129c0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
129d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
129e0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
129f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
12a00 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
12a10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12a20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
12a30 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
12a40 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
12a50 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
12a60 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
12a70 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
12a80 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
12a90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12aa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12ab0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12ac0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
12ad0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12ae0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
12af0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
12b00 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
12b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12b20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12b40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
12b50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12b60 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
12b70 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
12b80 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
12b90 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
12ba0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
12bb0 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
12bc0 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
12bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12be0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
12bf0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
12c00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12c10 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
12c20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12c30 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
12c40 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
12c50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12c60 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
12c70 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
12c80 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
12c90 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
12ca0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
12ce0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
12cf0 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
12d00 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
12d10 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
12d20 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
12d30 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
12d40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
12d50 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
12d60 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
12d70 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
12d80 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
12d90 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
12da0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
12db0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
12dc0 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
12dd0 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
12de0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
12df0 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
12e00 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
12e10 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
12e20 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
12e30 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
12e40 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
12e50 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
12e60 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
12e70 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
12e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
12e90 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
12ea0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
12eb0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
12ec0 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
12ed0 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
12ee0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
12ef0 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
12f00 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
12f10 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
12f20 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
12f30 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
12f40 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
12f50 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12f60 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
12f70 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
12f80 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
12f90 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
12fa0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
12fb0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
12fc0 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
12fd0 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
12fe0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
12ff0 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
13000 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
13010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13020 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
13030 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
13040 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
13050 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
13060 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13070 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
13080 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
130a0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
130b0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
130c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
130d0 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
130e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
130f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
13100 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
13110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
13120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
13130 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
13140 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
13150 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
13160 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
13170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
13180 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
13190 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
131a0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
131b0 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
131c0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
131d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
131e0 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
131f0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
13200 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
13210 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
13220 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
13230 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13240 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
13250 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
13260 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
13270 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
13280 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
13290 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
132a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
132b0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
132c0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
132d0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
132e0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
132f0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13300 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
13310 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
13320 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13330 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
13340 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
13350 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13360 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13370 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
13380 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
13390 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
133a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
133b0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
133c0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
133d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
133e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
133f0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
13400 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13410 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
13420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13430 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
13440 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
13450 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
13460 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
13470 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
13480 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
13490 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
134a0 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
134b0 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
134c0 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
134d0 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
134e0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
134f0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
13500 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
13510 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
13520 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
13530 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
13540 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
13550 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
13560 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
13570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
13580 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13590 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
135a0 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
135b0 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
135c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
135d0 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
135e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
135f0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
13600 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
13610 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
13620 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13630 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
13640 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
13650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13660 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
13670 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
13680 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
13690 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
136a0 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
136b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f  f /* SQLITE_HAS_
136c0 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f  CODEC || SQLITE_
136d0 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64  DEBUG */..#if !d
136e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
136f0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
13700 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13710 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
13720 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
13730 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
13740 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
13750 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
13760 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
13770 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
13780 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
13790 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
137a0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
137b0 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
137c0 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
137d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
137e0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
137f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13800 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
13810 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
13820 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
13830 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
13840 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
13850 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13860 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
13870 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
13880 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
13890 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
138a0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
138b0 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
138c0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
138d0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
138e0 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
138f0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
13900 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
13910 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
13920 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
13930 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13940 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
13950 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13960 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
13970 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13980 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
13990 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
139a0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
139b0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
139c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
139d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
139e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
139f0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
13a00 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
13a10 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
13a20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
13a30 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
13a40 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
13a50 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
13a60 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
13a70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
13a80 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
13a90 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
13aa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13ab0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
13ac0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
13ad0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
13ae0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13af0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
13b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13b10 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
13b20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
13b30 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
13b40 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
13b50 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
13b60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13b70 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
13b80 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
13b90 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
13ba0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
13bb0 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
13bc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13bd0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
13be0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13bf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
13c00 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
13c10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c20 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
13c30 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
13c40 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
13c50 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
13c60 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
13c70 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
13c80 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
13c90 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
13ca0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
13cb0 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
13cc0 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
13cd0 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
13ce0 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
13cf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
13d00 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
13d10 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
13d20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13d30 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
13d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13d50 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
13d60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
13d70 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
13d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13d90 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
13da0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
13db0 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
13dc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13dd0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
13de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
13df0 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
13e00 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
13e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
13e20 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
13e30 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
13e40 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
13e50 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
13e60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
13e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
13e80 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
13e90 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13ea0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
13eb0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13ec0 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
13ed0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13ee0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13ef0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
13f00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13f10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13f20 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
13f30 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
13f40 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
13f50 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
13f60 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
13f70 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
13f80 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
13f90 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
13fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13fb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
13fc0 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
13fd0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
13fe0 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
13ff0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14000 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
14010 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
14020 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
14030 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
14040 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
14050 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
14060 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
14070 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
14080 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
14090 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
140a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
140b0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
140c0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
140d0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
140e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
140f0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
14100 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
14110 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
14120 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
14130 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14140 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
14150 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
14160 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
14170 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
14180 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
14190 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
141a0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
141b0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
141c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
141d0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
141e0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
141f0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
14200 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
14210 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
14220 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
14230 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
14240 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14250 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
14260 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
14270 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
14280 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
14290 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
142a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
142b0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
142c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
142d0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
142e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
142f0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
14300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14310 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
14320 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
14330 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
14340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14350 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
14360 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
14370 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
14380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14390 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
143a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
143b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
143c0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
143d0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
143e0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
143f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14400 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14410 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
14420 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
14430 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
14440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14450 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
14460 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
14470 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
14480 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
14490 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
144a0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
144b0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
144c0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
144d0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
144e0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
144f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
14500 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14510 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
14520 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
14530 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
14540 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
14550 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
14560 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
14570 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
14580 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
14590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
145a0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
145b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
145c0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
145d0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
145e0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
145f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
14600 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
14610 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
14620 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
14630 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
14640 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14650 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
14660 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
14670 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
14680 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
14690 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
146a0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
146b0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
146c0 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
146d0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
146e0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
146f0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
14700 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
14710 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14720 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
14730 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
14740 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
14750 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14760 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14770 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
14780 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
14790 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
147a0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
147b0 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
147c0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
147d0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
147e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
147f0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
14800 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
14810 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
14820 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
14830 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
14840 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
14850 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
14860 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
14870 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
14880 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
14890 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
148a0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
148b0 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
148c0 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
148d0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
148e0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
148f0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
14900 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
14910 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
14920 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
14930 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
14940 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
14950 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14960 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
14970 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
14980 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
14990 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
149a0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
149b0 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
149c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
149e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
149f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
14a00 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
14a10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
14a20 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
14a30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14a50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
14a60 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
14a70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
14a80 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
14a90 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
14aa0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
14ab0 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
14ac0 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
14ad0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
14ae0 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
14af0 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
14b00 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
14b10 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
14b20 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
14b30 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
14b40 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
14b50 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
14b60 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
14b70 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
14b80 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
14b90 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
14ba0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
14bb0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
14bc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14bd0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
14bf0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
14c00 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
14c10 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14c20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
14c30 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
14c40 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
14c50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
14c60 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
14c70 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
14c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14c90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14ca0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14cb0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
14cc0 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
14cd0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
14ce0 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
14cf0 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
14d00 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
14d10 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
14d20 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
14d30 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14d40 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
14d50 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
14d60 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
14d70 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
14d80 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
14d90 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
14da0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
14db0 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
14dc0 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
14dd0 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
14de0 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
14df0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
14e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e10 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
14e20 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
14e30 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
14e40 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
14e50 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
14e60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
14e70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14e80 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
14e90 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
14ea0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
14eb0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
14ec0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
14ed0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
14ee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14ef0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14f00 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14f10 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
14f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
14f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14f70 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
14f80 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
14f90 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
14fa0 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
14fb0 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
14fc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14fd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14fe0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14ff0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
15000 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
15010 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
15020 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15030 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
15040 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
15050 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
15060 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
15070 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
15080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15090 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
150a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
150b0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
150c0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
150d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
150e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
150f0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
15100 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
15110 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
15120 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
15130 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
15140 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
15150 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
15160 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
15170 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
15180 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
15190 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
151a0 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
151b0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
151c0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
151d0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
151e0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
151f0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
15200 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
15210 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
15220 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
15230 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
15240 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
15250 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
15260 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
15270 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
15280 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
15290 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
152a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
152b0 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
152c0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
152d0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
152e0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
152f0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
15300 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
15310 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
15320 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
15330 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
15340 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
15350 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
15360 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
15370 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
15380 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
15390 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
153a0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
153b0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
153c0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
153d0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
153e0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
153f0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
15400 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
15410 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
15420 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
15430 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
15440 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
15450 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
15460 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
15470 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
15480 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
15490 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
154a0 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
154b0 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
154c0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
154d0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
154e0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
154f0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
15500 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
15510 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
15520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
15530 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15540 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
15550 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
15560 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
15570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15580 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
15590 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
155a0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
155b0 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
155c0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
155d0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
155e0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
155f0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
15600 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
15610 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
15620 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
15630 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
15640 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
15650 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
15660 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
15670 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
15680 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
15690 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
156a0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
156b0 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
156c0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
156d0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
156e0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
156f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15700 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
15710 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
15720 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
15730 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
15740 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
15750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15760 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
15770 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
15780 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
15790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
157a0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
157b0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
157c0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
157d0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
157e0 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
157f0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
15800 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
15810 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
15820 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
15830 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
15840 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
15850 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
15860 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
15870 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
15880 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
15890 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
158a0 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
158c0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
158d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
158e0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
158f0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
15900 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
15910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15920 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
15930 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
15940 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
15950 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
15960 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
15970 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
15980 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
15990 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
159a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
159b0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
159c0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
159d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
159e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
159f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15a00 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
15a10 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
15a20 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
15a30 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
15a40 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
15a50 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15a60 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
15a70 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
15a80 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
15a90 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
15aa0 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74  age1;.    assert
15ab0 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ( pPage1->aData 
15ac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
15ad0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
15ae0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
15af0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==1 );.    pBt->
15b00 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
15b10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
15b20 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
15b30 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
15b40 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
15b50 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
15b60 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
15b70 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
15b80 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
15b90 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
15ba0 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
15bb0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
15bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
15bd0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
15be0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
15bf0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
15c00 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
15c10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
15c20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15c30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
15c40 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
15c50 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
15c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c70 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
15c80 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
15c90 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
15ca0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
15cb0 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
15cc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
15cd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
15ce0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15cf0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
15d00 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
15d10 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
15d20 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
15d30 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
15d40 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
15d50 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
15d60 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
15d70 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
15d80 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
15d90 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
15da0 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
15db0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
15dc0 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
15dd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
15de0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
15df0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15e00 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
15e10 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
15e20 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
15e30 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
15e40 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
15e50 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
15e60 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
15e70 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
15e80 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
15e90 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
15ea0 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
15eb0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
15ec0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
15ed0 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
15ee0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
15ef0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
15f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15f10 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
15f20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
15f30 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
15f40 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
15f50 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
15f60 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
15f70 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
15f80 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
15f90 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
15fa0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
15fb0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
15fc0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
15fd0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
15fe0 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
15ff0 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
16000 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
16010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16020 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
16030 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
16040 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16050 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
16060 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
16070 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
16080 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
16090 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
160a0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
160b0 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
160c0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
160d0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
160e0 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
160f0 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
16100 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16110 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
16120 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
16130 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
16140 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
16150 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
16160 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16170 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
16190 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
161a0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
161b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
161c0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
161d0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
161e0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
161f0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
16200 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
16210 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
16220 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
16230 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
16240 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
16250 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
16260 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
16270 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
16280 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
16290 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
162a0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
162b0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
162c0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
162d0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
162e0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
162f0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
16300 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
16310 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
16320 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
16330 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
16340 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
16350 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
16360 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
16370 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
16380 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
16390 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
163a0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
163b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
163c0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
163d0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
163e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
163f0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
16400 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16410 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
16420 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
16430 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
16440 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
16450 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
16460 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
16470 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
16480 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
16490 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
164a0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
164b0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
164c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
164d0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
164e0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
164f0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
16500 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
16510 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
16520 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
16530 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
16540 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
16550 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
16560 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
16570 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
16580 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
16590 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
165a0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
165b0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
165c0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
165d0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
165e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
165f0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
16600 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
16610 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
16620 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
16630 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
16640 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
16650 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
16660 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
16670 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
16680 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
16690 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
166a0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
166b0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
166c0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
166d0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
166e0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
166f0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
16700 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
16710 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
16720 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
16730 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
16740 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
16750 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
16760 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
16770 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
16780 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
16790 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
167a0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
167b0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
167c0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
167d0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
167e0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
167f0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
16800 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
16810 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
16820 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
16830 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
16840 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
16850 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
16860 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
16870 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16890 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
168a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
168b0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
168c0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
168d0 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
168e0 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
168f0 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
16900 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
16910 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
16920 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
16930 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
16940 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
16950 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
16960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
16970 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16980 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
16990 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
169a0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
169b0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
169c0 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
169d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
169e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
169f0 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
16a00 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
16a10 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  e)==0 );..  /* W
16a20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16a30 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
16a40 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
16a50 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
16a60 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
16a70 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
16a80 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
16a90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16aa0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16ab0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
16ac0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
16ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16ae0 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
16af0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
16b00 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
16b10 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
16b20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
16b30 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
16b40 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
16b50 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
16b60 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
16b70 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
16b80 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
16b90 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
16ba0 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
16bb0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
16bc0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
16bd0 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d  ITE).   || (pBt-
16be0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16bf0 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b  PENDING)!=0.  ){
16c00 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
16c10 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
16c20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
16c30 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
16c40 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
16c50 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
16c60 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
16c70 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
16c80 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
16c90 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
16ca0 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
16cb0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
16cc0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
16cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16ce0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
16cf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
16d00 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
16d10 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
16d20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16d30 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
16d40 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
16d50 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
16d60 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
16d70 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
16d80 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
16d90 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
16da0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
16db0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
16dc0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
16dd0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
16de0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
16df0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
16e00 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
16e10 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
16e20 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
16e30 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
16e40 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
16e50 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
16e60 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
16e70 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
16e80 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
16e90 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
16ea0 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
16eb0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
16ec0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
16ed0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
16ee0 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
16ef0 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
16f00 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
16f10 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
16f20 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
16f30 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
16f40 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
16f50 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
16f60 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
16f70 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
16f80 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
16f90 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
16fa0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
16fb0 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
16fc0 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
16fd0 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
16fe0 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
16ff0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
17000 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17010 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
17020 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
17030 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
17040 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
17050 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
17060 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
17070 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
17080 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
17090 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
170a0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
170b0 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
170c0 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
170d0 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
170e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
170f0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
17100 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
17110 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
17120 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
17130 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17140 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
17150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17160 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17170 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
17180 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
17190 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
171a0 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
171b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
171c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
171d0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
171e0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
171f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17200 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
17210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17220 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
17230 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17240 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
17250 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
17260 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
17270 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
17280 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
17290 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
172a0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
172b0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
172c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
172d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
172e0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
172f0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
17300 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
17310 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
17320 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
17330 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
17340 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17350 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
17360 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
17370 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
17380 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
17390 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
173a0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
173b0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
173c0 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
173d0 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
173e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
173f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
17400 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
17410 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
17420 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
17430 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
17440 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
17450 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
17460 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
17470 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
17480 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
17490 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
174a0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
174b0 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
174c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
174d0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
174e0 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
174f0 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
17500 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
17510 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17520 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
17530 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
17540 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
17550 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
17560 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
17570 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
17580 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
17590 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
175a0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
175b0 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
175c0 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
175d0 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
175e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
175f0 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
17600 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
17610 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
17620 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
17630 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
17640 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
17650 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
17660 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
17670 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
17680 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
17690 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
176a0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
176b0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
176c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
176d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
176e0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
176f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
17700 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
17710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17720 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
17730 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
17740 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
17750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17760 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17770 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
17780 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
17790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
177a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
177b0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
177c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
177d0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
177e0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
177f0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
17800 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
17810 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
17820 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
17830 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
17840 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
17850 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
17860 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
17870 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
17880 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
17890 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
178a0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
178b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
178c0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
178d0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
178e0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
178f0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
17900 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
17910 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
17920 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
17940 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17950 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
17960 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
17970 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
17980 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
17990 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
179a0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
179b0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
179c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
179d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
179e0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
179f0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
17a00 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
17a10 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
17a20 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
17a30 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
17a40 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
17a50 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
17a80 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
17a90 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ab0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
17ac0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
17ad0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
17b00 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
17b10 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
17b20 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
17b30 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
17b40 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
17b50 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
17b60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
17b70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17b80 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
17b90 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
17ba0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
17bb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17bc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
17bd0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
17be0 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
17bf0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
17c00 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
17c10 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
17c20 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
17c30 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
17c40 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
17c50 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
17c60 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
17c70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
17c80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
17c90 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
17ca0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
17cb0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
17cc0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
17cd0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
17ce0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
17cf0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
17d00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
17d10 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
17d20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
17d30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
17d40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
17d50 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17d60 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
17d70 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
17d80 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
17d90 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
17da0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
17db0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
17dc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17dd0 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
17de0 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
17df0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
17e00 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
17e10 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
17e20 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
17e30 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
17e40 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
17e50 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
17e60 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
17e70 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
17e80 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
17e90 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
17ea0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
17eb0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
17ec0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
17ed0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
17ee0 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
17ef0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
17f00 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
17f10 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
17f20 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
17f30 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
17f40 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
17f50 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
17f60 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
17f70 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
17f80 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
17f90 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
17fa0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
17fb0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
17fc0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
17fd0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
18000 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
18010 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
18020 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
18030 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
18040 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
18050 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
18060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18070 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
18080 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
18090 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
180a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
180b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
180c0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
180d0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
180e0 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
180f0 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
18100 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
18110 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
18120 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
18130 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
18140 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
18150 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
18160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18170 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18180 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
18190 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
181a0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
181b0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
181c0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
181d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
181e0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
181f0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
18200 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
18210 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
18220 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18230 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
18240 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
18250 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
18260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
18270 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
18280 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
18290 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
182a0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
182b0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
182c0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
182d0 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
182e0 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20  iOverflow.      
182f0 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f     && pCell+info
18300 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50  .iOverflow+3<=pP
18310 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
18320 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20  ->maskPage.     
18330 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65      && iFrom==ge
18340 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
18350 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20  fo.iOverflow]). 
18360 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
18370 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
18380 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
18390 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
183a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
183b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
183c0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
183d0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
183e0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
183f0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
18400 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
18410 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18420 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18430 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
18440 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
18450 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
18460 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
18470 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
18480 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
18490 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
184a0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
184b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
184c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
184d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
184e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
184f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
18500 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
18510 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
18520 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
18530 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
18540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18550 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
18560 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
18570 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
18580 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
18590 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
185a0 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
185b0 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
185c0 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
185d0 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
185e0 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
185f0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
18600 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
18610 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
18620 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
18630 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
18640 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
18650 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
18660 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
18670 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
18680 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
18690 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
186a0 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
186b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
186c0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
186d0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
186e0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
186f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
18700 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
18710 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
18720 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
18730 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18740 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
18750 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
18760 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
18770 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
18780 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18790 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
187a0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
187b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
187c0 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
187d0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
187e0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
187f0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
18800 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
18810 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
18820 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
18830 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
18840 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
18850 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
18860 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
18870 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
18880 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
18890 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
188a0 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
188b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
188c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
188d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
188e0 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
188f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
18900 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
18910 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
18920 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
18930 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
18940 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
18950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
18960 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18970 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
18980 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
18990 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
189a0 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
189b0 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
189c0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
189d0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
189e0 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
189f0 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
18a00 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
18a10 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
18a20 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
18a30 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
18a40 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
18a50 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
18a60 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
18a70 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
18a80 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
18a90 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
18aa0 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
18ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18ad0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
18ae0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
18af0 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
18b00 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
18b10 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
18b20 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
18b30 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
18b40 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
18b50 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
18b60 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
18b70 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
18b80 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
18b90 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
18ba0 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
18bb0 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
18bc0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
18bd0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
18be0 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
18bf0 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
18c00 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
18c10 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
18c20 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
18c30 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
18c40 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
18c50 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
18c60 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
18c70 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
18c80 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
18c90 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
18ca0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
18cb0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
18cc0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
18cd0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
18ce0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
18cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18d00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
18d10 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
18d20 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
18d30 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
18d40 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
18d50 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
18d60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
18d70 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
18d80 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
18d90 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
18da0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
18db0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18dd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18de0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
18df0 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
18e00 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
18e10 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
18e20 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
18e30 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
18e40 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
18e50 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
18e60 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
18e70 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
18e80 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
18e90 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
18ea0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
18eb0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
18ec0 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
18ed0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
18ee0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18f10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18f20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
18f30 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
18f40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18f60 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
18f70 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
18f80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18f90 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
18fa0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
18fb0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
18fc0 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
18fd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
18fe0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
18ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19000 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
19010 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
19020 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
19030 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
19040 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19050 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
19060 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
19070 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
19080 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
19090 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
190a0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
190b0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
190c0 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
190d0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
190e0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
190f0 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
19100 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
19110 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
19120 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
19130 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
19140 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
19150 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
19160 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
19170 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
19180 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
19190 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
191a0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
191b0 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
191c0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
191d0 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
191e0 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
191f0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
19200 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
19210 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
19220 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
19230 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
19240 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
19250 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
19260 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
19270 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
19280 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
19290 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
192a0 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
192b0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
192c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
192d0 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
192e0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
192f0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
19300 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
19310 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
19320 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
19330 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
19340 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
19350 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
19360 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
19370 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
19380 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
19390 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
193a0 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
193b0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
193c0 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
193d0 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
193e0 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
193f0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
19400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
19410 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
19420 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
19430 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
19440 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
19450 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
19460 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
19470 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
19480 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
19490 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
194a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
194b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
194c0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
194d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
194e0 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
194f0 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
19500 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
19510 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
19520 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19530 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
19540 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
19550 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
19560 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
19570 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19580 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
19590 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
195a0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
195b0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
195c0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
195d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
195e0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
195f0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
19600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19610 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19620 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
19630 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
19640 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
19650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19660 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19670 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
19680 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
19690 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
196a0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
196b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
196c0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
196d0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
196e0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
196f0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
19700 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
19710 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
19720 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
19730 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
19740 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
19750 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
19760 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19770 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
19780 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
19790 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
197a0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
197b0 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
197c0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
197d0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
197e0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
197f0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
19800 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
19810 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
19820 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
19830 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
19840 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
19850 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19870 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19880 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
198a0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
198b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
198c0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
198d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
198e0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
198f0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
19900 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
19910 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
19920 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
19930 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
19940 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
19950 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
19960 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
19970 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
19980 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
19990 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
199a0 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
199b0 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
199c0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
199d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
199e0 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
199f0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
19a00 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
19a10 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
19a20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
19a40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19a50 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
19a60 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
19a70 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
19a80 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
19a90 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
19aa0 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
19ab0 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
19ac0 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
19ad0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
19ae0 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
19af0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
19b00 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
19b10 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
19b20 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
19b30 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
19b40 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
19b50 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
19b60 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
19b70 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
19b80 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
19b90 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
19ba0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
19bb0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
19bc0 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
19bd0 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
19be0 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
19bf0 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
19c00 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
19c10 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
19c20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
19c30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
19c40 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
19c50 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
19c60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
19c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19c80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
19c90 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
19ca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19cc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19cd0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
19ce0 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
19cf0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
19d00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19d10 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
19d20 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
19d30 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
19d40 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
19d50 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
19d60 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
19d70 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
19d80 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
19d90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19db0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19dd0 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
19de0 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
19df0 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
19e00 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
19e10 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
19e20 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
19e30 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
19e40 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
19e50 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
19e60 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
19e70 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
19e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19ea0 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
19eb0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
19ec0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
19ed0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
19ee0 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
19ef0 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
19f00 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
19f10 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
19f20 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
19f30 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
19f40 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
19f50 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
19f60 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
19f70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
19f80 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
19f90 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
19fa0 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
19fb0 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
19fc0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
19fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19fe0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
19ff0 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1a000 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1a010 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1a020 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a030 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1a040 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1a050 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1a080 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1a090 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1a0a0 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1a0b0 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1a0c0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1a0d0 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1a0e0 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1a0f0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1a100 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1a110 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1a120 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1a130 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1a140 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a150 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1a160 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1a170 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1a180 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1a190 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1a1a0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1a1b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1a1c0 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1a1d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a1e0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1a1f0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1a200 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1a210 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1a220 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1a230 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1a240 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1a250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1a260 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1a270 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1a280 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1a290 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1a2a0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1a2b0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1a2c0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1a2d0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1a2e0 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1a2f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1a300 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1a310 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1a320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a330 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1a340 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1a350 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1a360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1a370 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a380 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1a390 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a3a0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a3b0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1a3c0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1a3d0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1a3e0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1a3f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1a400 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1a410 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1a420 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1a430 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1a440 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a450 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1a460 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1a470 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1a480 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1a490 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1a4a0 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1a4b0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1a4c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1a4d0 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1a4e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1a4f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1a500 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1a510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a520 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1a530 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1a540 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1a550 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1a560 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1a570 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1a580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a590 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a5a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a5b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a5c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1a5d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1a5e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1a5f0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1a600 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1a610 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1a620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a630 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1a640 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1a650 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a660 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a670 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1a680 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1a690 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1a6a0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1a6b0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1a6c0 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1a6d0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1a6e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1a6f0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1a700 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1a710 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1a720 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1a730 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1a740 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1a750 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1a760 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1a770 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1a780 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1a790 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1a7a0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1a7b0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1a7c0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1a7d0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1a7e0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1a7f0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1a800 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1a810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1a820 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1a830 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1a840 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1a850 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1a860 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1a870 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1a880 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1a890 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a8a0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1a8b0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1a8c0 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1a8d0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1a8e0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1a8f0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1a900 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1a910 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a920 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1a930 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1a940 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1a950 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1a960 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1a970 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1a980 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1a990 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1a9a0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1a9b0 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1a9c0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1a9d0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1a9e0 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1a9f0 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1aa00 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1aa10 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1aa20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1aa30 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1aa40 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1aa50 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1aa60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1aa70 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1aa80 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1aa90 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1aaa0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1aab0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1aac0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1aad0 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1aae0 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1aaf0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1ab00 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1ab10 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1ab20 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1ab30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ab40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ab50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1ab60 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1ab70 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ab80 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1ab90 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1aba0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1abb0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1abc0 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1abd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1abe0 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1abf0 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1ac00 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1ac10 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1ac20 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ac30 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1ac40 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1ac50 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1ac60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1ac70 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1ac80 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1ac90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1aca0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1acb0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1acc0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1acd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1ace0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1acf0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1ad00 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1ad10 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1ad20 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1ad30 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1ad40 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1ad50 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1ad60 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1ad70 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1ad80 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1ad90 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1ada0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1adb0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1adc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1add0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ade0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1adf0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1ae00 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1ae10 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1ae20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1ae30 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1ae40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ae50 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1ae60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ae70 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1ae80 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1ae90 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1aea0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1aeb0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1aec0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1aed0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1aee0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1aef0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1af00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1af10 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1af20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1af30 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1af40 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1af50 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1af60 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1af70 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1af80 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1af90 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1afa0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1afb0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1afc0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1afd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1afe0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1aff0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1b000 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1b010 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1b020 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1b030 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1b040 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1b050 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1b060 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1b070 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1b080 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1b090 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1b0a0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1b0b0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1b0c0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1b0d0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1b0e0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1b0f0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1b100 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1b110 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1b120 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1b130 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1b140 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1b150 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1b160 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1b170 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1b180 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1b190 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1b1a0 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1b1b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1b1c0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1b1d0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1b1e0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1b1f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b200 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1b210 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1b220 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1b230 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1b240 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1b250 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1b260 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1b270 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1b280 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1b290 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1b2a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b2b0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1b2c0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1b2d0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1b2e0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1b2f0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1b300 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1b310 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1b320 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1b330 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1b340 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1b350 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1b360 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1b370 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1b380 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1b390 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1b3a0 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1b3b0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1b3c0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1b3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1b3e0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1b3f0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1b400 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b410 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1b420 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1b430 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1b440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b450 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b460 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1b470 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1b480 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1b490 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b4a0 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1b4b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b4c0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1b4d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1b4e0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1b4f0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1b500 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b520 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b530 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1b540 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b560 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1b570 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1b580 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1b590 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1b5a0 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1b5b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b5c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b5d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1b5e0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1b5f0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1b600 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b610 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1b620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b630 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b640 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1b650 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1b660 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1b670 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1b680 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1b690 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1b6a0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1b6b0 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1b6c0 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1b6d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1b6e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1b6f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1b700 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1b710 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b720 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1b730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1b740 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1b750 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1b760 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1b770 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1b780 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1b790 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1b7a0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1b7b0 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1b7c0 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1b7d0 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1b7e0 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1b7f0 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1b800 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1b810 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1b820 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1b830 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1b840 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1b850 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1b860 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1b870 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1b880 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1b890 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1b8a0 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1b8b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1b8c0 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1b8d0 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1b8e0 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1b8f0 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1b900 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1b910 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1b920 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1b930 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1b940 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1b950 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1b960 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1b970 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1b980 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1b990 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1b9a0 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1b9b0 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1b9c0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1b9d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1b9e0 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1b9f0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1ba00 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1ba10 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1ba20 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1ba30 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1ba40 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1ba50 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1ba60 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1ba70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ba80 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1ba90 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1baa0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1bab0 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1bac0 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1bad0 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1bae0 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1baf0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1bb00 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1bb10 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1bb20 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1bb30 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1bb40 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1bb50 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bb60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1bb70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bb80 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1bb90 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1bba0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1bbb0 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1bbc0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1bbd0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1bbe0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1bbf0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1bc00 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1bc10 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1bc20 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1bc30 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1bc40 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1bc50 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1bc60 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1bc70 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1bc80 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1bc90 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1bca0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1bcb0 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1bcc0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1bcd0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1bce0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1bcf0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1bd00 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1bd10 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1bd20 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1bd30 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1bd40 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1bd50 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1bd60 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1bd70 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1bd80 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1bd90 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1bda0 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1bdb0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1bdc0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1bdd0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1bde0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1bdf0 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1be00 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1be10 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1be20 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1be30 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1be40 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1be50 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1be60 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1be70 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1be80 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1be90 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1bea0 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1beb0 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1bec0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1bed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1bee0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1bef0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1bf00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1bf10 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1bf20 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1bf30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1bf40 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1bf50 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1bf60 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1bf70 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1bf80 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1bf90 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1bfa0 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1bfb0 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1bfc0 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1bfd0 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1bfe0 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1bff0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1c000 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1c010 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1c020 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1c030 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1c040 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1c050 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1c060 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1c070 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1c080 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1c090 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1c0a0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1c0b0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1c0c0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1c0d0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1c0e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c0f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1c100 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1c110 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1c120 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1c130 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1c140 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1c150 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c160 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1c170 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1c180 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1c190 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1c1a0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1c1b0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1c1c0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1c1d0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1c1e0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1c1f0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1c200 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1c210 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c220 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1c230 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1c240 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1c250 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1c260 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1c270 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1c280 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1c290 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1c2a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c2b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1c2c0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1c2d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c2e0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1c2f0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1c300 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c310 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1c320 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c330 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c340 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1c350 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
1c360 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
1c370 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1c380 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1c390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c3a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c3b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c3c0 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
1c3d0 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
1c3e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c3f0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
1c400 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1c410 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c420 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
1c430 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1c440 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
1c450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c460 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1c470 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1c480 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
1c490 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1c4a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c4c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c4d0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
1c4e0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
1c4f0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
1c500 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
1c510 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
1c520 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
1c530 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
1c540 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
1c550 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
1c560 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
1c570 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
1c580 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
1c590 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1c5a0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
1c5b0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
1c5c0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
1c5d0 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
1c5e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1c5f0 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
1c600 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1c610 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
1c620 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
1c630 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
1c640 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
1c650 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
1c660 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
1c670 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
1c680 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
1c690 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1c6a0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
1c6b0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
1c6c0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
1c6d0 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
1c6e0 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
1c6f0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
1c700 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
1c710 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
1c720 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
1c730 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
1c740 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
1c750 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
1c760 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
1c770 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
1c780 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74 75  pBtree==0 ) retu
1c790 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rn;.  sqlite3Btr
1c7a0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1c7b0 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
1c7c0 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1c7d0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1c7e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
1c7f0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1c800 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d  ursor(p);.    p-
1c810 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1c820 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73  _FAULT;.    p->s
1c830 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
1c840 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e;.    for(i=0; 
1c850 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
1c860 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1c870 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69  Page(p->apPage[i
1c880 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50  ]);.      p->apP
1c890 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
1c8a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1c8b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1c8c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
1c8d0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
1c8e0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1c8f0 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
1c900 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
1c910 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
1c920 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
1c930 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
1c940 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
1c950 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
1c960 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
1c970 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
1c980 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
1c990 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
1c9a0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1c9b0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1c9c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c9d0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
1c9e0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
1c9f0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
1ca00 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
1ca10 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
1ca20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
1ca30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
1ca40 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
1ca50 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1ca60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ca70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1ca80 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1ca90 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
1caa0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1cab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1cac0 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
1cad0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1cae0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1caf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1cb00 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
1cb10 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  pCode ){.    sql
1cb20 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1cb30 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
1cb40 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65  ode);.  }.  btre
1cb50 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1cb60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cb70 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1cb80 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1cb90 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1cba0 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1cbb0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1cbc0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1cbd0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1cbe0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1cbf0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1cc00 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1cc10 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1cc20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1cc30 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1cc40 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1cc50 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1cc60 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1cc70 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1cc80 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1cc90 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1cca0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1ccb0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1ccc0 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1ccd0 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1cce0 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1ccf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1cd00 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1cd10 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1cd20 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1cd30 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1cd40 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1cd50 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1cd60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1cd70 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1cd80 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1cd90 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1cda0 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1cdb0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1cdc0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1cdd0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1cde0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1cdf0 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1ce00 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
1ce10 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1ce20 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1ce30 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1ce40 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1ce50 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1ce60 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1ce70 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1ce80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1ce90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cea0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1ceb0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1cec0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1ced0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
1cee0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1cef0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1cf00 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1cf10 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1cf20 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1cf30 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1cf40 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1cf50 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1cf60 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1cf70 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1cf80 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1cf90 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1cfa0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1cfb0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1cfc0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1cfd0 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1cfe0 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1cff0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1d000 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1d010 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1d020 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1d030 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1d040 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1d050 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1d060 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1d070 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1d080 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1d090 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1d0a0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1d0b0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1d0c0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1d0d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1d0e0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1d0f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1d100 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1d110 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1d120 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1d130 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1d140 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1d150 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1d160 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1d170 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1d180 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1d190 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1d1a0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1d1b0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1d1c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1d1d0 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1d1e0 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1d1f0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1d200 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1d210 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1d220 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1d230 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1d240 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1d250 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1d260 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1d270 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1d280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d290 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1d2a0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1d2b0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1d2c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1d2d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1d2e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d2f0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1d300 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d310 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1d320 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1d330 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1d340 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1d350 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1d360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1d370 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1d380 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1d390 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1d3a0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1d3b0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1d3c0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1d3d0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1d3e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1d3f0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1d400 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1d410 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1d420 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1d430 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1d440 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1d450 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1d460 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1d470 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1d480 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1d490 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1d4a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1d4b0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1d4c0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1d4d0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1d4e0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1d4f0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1d500 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1d510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1d520 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1d530 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1d540 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d550 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1d560 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1d570 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1d580 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1d590 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1d5a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1d5b0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1d5c0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1d5d0 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1d5e0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1d5f0 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1d600 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1d610 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1d620 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1d630 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1d640 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1d650 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1d660 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1d670 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1d680 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1d690 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1d6a0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1d6b0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1d6c0 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1d6d0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1d6e0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1d6f0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1d700 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1d710 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1d720 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1d730 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1d740 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1d750 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1d760 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1d770 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1d780 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1d790 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1d7a0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1d7b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d7c0 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1d7d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1d7e0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1d7f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1d800 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1d810 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1d820 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1d830 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1d840 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1d850 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1d860 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1d870 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1d880 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1d890 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d8a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1d8b0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1d8c0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1d8d0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1d8e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d8f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1d900 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1d910 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1d920 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1d930 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1d940 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1d950 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1d960 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1d970 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1d980 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1d990 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1d9a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1d9b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1d9c0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1d9d0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1d9e0 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1d9f0 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1da00 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1da10 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1da20 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1da30 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1da40 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1da50 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1da60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1da70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1da80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1da90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1daa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1dab0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1dac0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1dad0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1dae0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1daf0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1db00 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1db10 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1db20 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1db30 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1db40 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1db50 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1db60 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1db70 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1db80 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1db90 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1dba0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1dbb0 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1dbc0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1dbd0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1dbe0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1dbf0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1dc00 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1dc10 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1dc20 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1dc30 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1dc40 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1dc50 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1dc60 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1dc70 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1dc80 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1dc90 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1dca0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1dcb0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1dcc0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1dcd0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1dce0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1dcf0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1dd00 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1dd10 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1dd20 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1dd30 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1dd40 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1dd50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1dd60 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1dd70 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1dd80 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1dd90 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1dda0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1ddb0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1ddc0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1ddd0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1dde0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1ddf0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1de00 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1de10 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1de20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1de30 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1de40 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1de50 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1de60 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1de70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1de80 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1de90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1dea0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1deb0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1dec0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1ded0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1dee0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1def0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1df00 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1df10 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1df20 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1df30 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1df40 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1df50 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1df60 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1df70 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1df80 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1df90 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1dfa0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1dfb0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1dfc0 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1dfd0 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1dfe0 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1dff0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1e000 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1e010 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1e020 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1e030 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1e040 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e070 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1e080 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1e0b0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1e0c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1e0d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e0f0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1e100 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1e110 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1e120 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1e130 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1e140 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1e150 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1e160 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1e190 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1e1a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1e1b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e1d0 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1e1e0 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1e1f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1e200 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1e210 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1e220 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1e230 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1e240 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1e250 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1e260 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1e270 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1e280 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1e290 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1e2a0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1e2b0 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1e2c0 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1e2d0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1e2e0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1e2f0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1e300 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1e310 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1e320 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e330 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1e340 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1e350 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1e360 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1e370 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1e380 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1e390 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1e3a0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1e3b0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1e3c0 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1e3d0 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1e3e0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1e3f0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1e400 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1e410 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1e420 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1e430 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1e440 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1e450 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1e460 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1e470 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1e480 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1e490 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1e4a0 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
1e4b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
1e4c0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1e4d0 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
1e4e0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
1e4f0 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
1e500 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
1e510 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e520 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
1e530 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
1e540 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1e550 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
1e560 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
1e570 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
1e580 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1e590 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1e5a0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1e5b0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1e5c0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1e5d0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1e5e0 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1e5f0 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1e600 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1e610 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1e620 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1e630 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1e640 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1e650 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1e660 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1e670 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1e680 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
1e690 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
1e6a0 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
1e6b0 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
1e6c0 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
1e6d0 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
1e6e0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
1e6f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
1e700 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
1e710 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1e720 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
1e730 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
1e740 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1e750 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1e760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e770 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1e780 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1e790 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7c0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1e7d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1e800 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1e810 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1e820 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1e850 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1e860 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1e870 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1e880 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1e890 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1e8a0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1e8b0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1e8c0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1e8f0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1e900 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1e910 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e920 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1e930 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1e940 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1e950 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1e960 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e970 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e980 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e990 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1e9a0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1e9b0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1e9c0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1e9d0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1e9e0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1e9f0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1ea00 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1ea10 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1ea20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1ea30 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1ea40 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1ea50 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1ea60 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1ea70 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1ea80 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1ea90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1eaa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1eab0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1eac0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1ead0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1eae0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1eaf0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1eb00 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1eb10 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1eb20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1eb30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1eb40 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1eb50 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1eb60 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1eb70 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1eb80 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1eb90 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1eba0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1ebb0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1ebc0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1ebd0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1ebe0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1ebf0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1ec00 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1ec10 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1ec20 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1ec30 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1ec40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1ec50 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1ec60 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1ec70 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1ec80 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1ec90 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1eca0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1ecb0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1ecc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ecd0 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1ece0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1ecf0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1ed00 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ed10 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1ed20 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1ed30 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1ed40 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1ed50 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1ed60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1ed70 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1ed80 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1ed90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1eda0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1edb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1edc0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1edd0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1ede0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1edf0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1ee00 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1ee10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1ee30 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1ee40 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1ee50 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1ee60 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1ee70 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1ee80 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ee90 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1eea0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1eeb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1eec0 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1eed0 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1eee0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1eef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1ef00 72 65 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20  ree(pBtree->db, 
1ef10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
1ef20 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1ef30 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1ef40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ef50 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1ef60 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ef70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ef80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1ef90 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1efa0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1efb0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1efc0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1efd0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1efe0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1eff0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1f000 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1f010 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1f020 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1f030 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1f040 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1f050 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1f060 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1f070 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1f080 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1f090 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1f0a0 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1f0b0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1f0c0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1f0d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1f0e0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1f0f0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1f100 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1f110 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1f120 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1f130 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1f140 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1f150 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1f160 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1f170 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1f180 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1f190 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1f1a0 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1f1b0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1f1c0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1f1d0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 67 72 65   not doing aggre
1f1e0 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1f1f0 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1f200 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1f210 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1f220 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1f230 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1f240 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1f250 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1f260 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1f270 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1f280 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1f290 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1f2a0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1f2b0 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1f2c0 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1f2d0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1f2e0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1f2f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1f300 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1f310 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1f320 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
1f330 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70  UPT_DB || memcmp
1f340 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1f350 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1f360 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1f370 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1f380 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1f390 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1f3a0 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1f3b0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1f3c0 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1f3d0 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1f3e0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1f3f0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1f400 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1f410 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1f420 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1f430 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1f440 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1f450 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1f460 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1f470 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1f480 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1f490 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1f4a0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  );.      pCur->c
1f4b0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
1f4c0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d  ValidNKey;.    }
1f4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1f4e0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
1f4f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
1f500 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
1f510 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
1f520 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
1f530 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
1f540 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
1f550 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
1f560 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
1f570 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
1f5c0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61     \.    int iPa
1f610 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1f620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50      \.    btreeP
1f660 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1f670 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1f680 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1f690 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20  &pCur->info);   
1f6a0 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d       \.    pCur-
1f6b0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
1f6c0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20  F_ValidNKey;    
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6f0 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1f750 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1f760 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1f7a0 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1f7b0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1f7c0 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1f7d0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1f7e0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1f7f0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1f800 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1f810 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1f820 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1f830 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1f840 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1f850 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1f860 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1f870 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1f880 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1f890 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1f8a0 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1f8b0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1f8c0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1f8d0 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1f8e0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1f8f0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1f900 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1f910 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1f920 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f930 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1f940 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1f950 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1f960 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1f970 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1f980 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1f990 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1f9a0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1f9b0 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1f9c0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1f9d0 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1f9e0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1f9f0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1fa00 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1fa10 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1fa20 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1fa30 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1fa40 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1fa50 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1fa60 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1fa70 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1fa80 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1fa90 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1faa0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1fab0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1fac0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1fad0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1fae0 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1faf0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1fb00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fb10 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1fb20 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1fb30 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1fb40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1fb50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1fb60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1fb70 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1fb80 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1fb90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1fba0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1fbb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1fbc0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1fbd0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1fbe0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1fbf0 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1fc00 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1fc10 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1fc20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fc30 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1fc40 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1fc50 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1fc60 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1fc70 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1fc80 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1fc90 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1fca0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1fcb0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1fcc0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1fcd0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1fce0 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1fcf0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1fd00 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1fd10 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1fd20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1fd30 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1fd40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fd50 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1fd60 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1fd70 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1fd80 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1fd90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1fda0 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1fdb0 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1fdc0 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1fdd0 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1fde0 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1fdf0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1fe00 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1fe10 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1fe20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fe30 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1fe40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1fe50 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1fe60 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1fe70 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1fe80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1fe90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fea0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1feb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fec0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65  r->iPage]->intKe
1fed0 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65  yLeaf==1 );.  ge
1fee0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1fef0 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
1ff00 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
1ff10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ff20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  _OK;.}../*.** Gi
1ff30 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1ff40 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1ff50 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1ff60 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1ff70 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1ff80 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1ff90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ffa0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1ffb0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1ffc0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1ffd0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1ffe0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1fff0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
20000 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
20010 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
20020 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
20030 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
20040 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
20050 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20060 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
20070 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
20080 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
20090 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
200a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
200b0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
200c0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
200d0 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
200e0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
200f0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
20100 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
20110 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
20120 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
20130 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
20140 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
20150 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
20160 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
20170 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
20180 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
20190 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
201a0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
201b0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
201c0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
201d0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
201e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
201f0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
20200 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
20210 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
20220 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
20230 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
20240 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
20250 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
20260 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
20270 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
20280 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
20290 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
202a0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
202b0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
202c0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
202d0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
202e0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
202f0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
20300 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
20310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20320 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20330 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20350 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
20360 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
20370 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
20380 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
20390 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
203a0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
203b0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
203c0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
203d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
203e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
203f0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
20400 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
20410 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
20420 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
20430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
20440 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20450 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
20460 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
20470 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
20480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20490 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
204a0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
204b0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
204c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
204d0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
204e0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
204f0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
20500 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
20510 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
20520 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
20530 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
20540 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
20550 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
20560 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
20570 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
20580 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
20590 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
205a0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
205b0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
205c0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
205d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
205e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
205f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
20600 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
20610 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
20620 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
20630 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
20640 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
20650 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
20660 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
20670 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
20680 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
20690 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
206a0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
206b0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
206c0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
206d0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
206e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
206f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
20700 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
20710 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
20720 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
20730 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
20740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20750 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
20760 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
20770 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
20780 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
20790 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
207a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
207b0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
207c0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
207d0 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
207e0 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
207f0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
20800 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20810 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
20820 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
20830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20840 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
20850 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
20860 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
20870 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
20880 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
20890 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
208a0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
208b0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
208c0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
208d0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
208e0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
208f0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
20900 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
20910 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
20920 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
20930 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
20940 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
20950 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
20960 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
20970 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
20980 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
20990 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
209a0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
209b0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
209c0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
209d0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
209e0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
209f0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
20a00 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
20a10 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
20a20 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
20a30 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
20a40 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
20a50 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
20a60 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
20a70 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
20a80 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
20a90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
20aa0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
20ab0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
20ac0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
20ad0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
20ae0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
20af0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
20b00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
20b10 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
20b20 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
20b30 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
20b40 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
20b50 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
20b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20b70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
20b80 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
20b90 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
20ba0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
20bb0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
20bc0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
20bd0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
20be0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
20bf0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
20c00 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
20c10 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
20c20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
20c30 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
20c40 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
20c50 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
20c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20c70 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
20c80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20c90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20cb0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
20cc0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
20cd0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
20ce0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
20cf0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
20d00 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
20d10 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
20d20 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
20d30 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
20d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20d50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
20d60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
20d70 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
20d80 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
20d90 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
20da0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
20db0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
20dc0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
20dd0 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
20de0 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
20df0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
20e00 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
20e10 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
20e20 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
20e30 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
20e40 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
20e50 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
20e60 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
20e70 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
20e80 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
20e90 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
20ea0 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
20eb0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
20ec0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
20ed0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
20ee0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
20ef0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
20f00 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
20f10 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
20f20 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
20f30 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
20f40 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
20f50 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
20f60 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
20f70 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
20f80 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
20f90 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
20fa0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
20fb0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
20fc0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
20fd0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
20fe0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
20ff0 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
21000 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
21010 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
21020 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
21030 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
21040 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
21050 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
21060 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21070 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
21080 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
21090 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
210a0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
210b0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
210c0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
210d0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
210e0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
210f0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
21100 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
21110 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
21120 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
21130 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
21140 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
21150 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
21160 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
21170 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
21180 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
21190 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
211a0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
211b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
211c0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
211d0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
211e0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
211f0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21200 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
21210 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
21220 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
21230 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
21240 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
21250 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
21260 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
21270 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
21280 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
21290 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
212a0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
212b0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
212c0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
212d0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
212e0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
212f0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
21300 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
21310 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
21320 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
21330 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
21340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21350 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
21360 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
21370 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
21380 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
21390 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
213a0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213c0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
213d0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
213e0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
213f0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
21400 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21410 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
21420 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
21430 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
21440 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21450 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
21460 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
21470 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
21480 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
21490 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
214a0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
214b0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
214c0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
214d0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
214e0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 69 6e  ERFLOW_READ.  in
214f0 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21520 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
21530 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
21540 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
21550 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
21560 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21570 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21580 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21590 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
215a0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
215b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
215c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
215d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
215e0 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
215f0 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
21600 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
21610 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
21620 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
21630 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
21640 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
21650 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
21660 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
21670 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
21680 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
21690 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
216a0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
216b0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
216c0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
216d0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
216e0 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
216f0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
21700 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
21710 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
21720 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
21730 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
21740 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
21750 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
21760 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
21770 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
21780 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21790 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
217a0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
217b0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
217c0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
217d0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
217e0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
217f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
21800 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
21810 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
21820 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
21830 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
21840 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
21850 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
21860 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
21870 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
21880 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
21890 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
218a0 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
218b0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
218c0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
218d0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
218e0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
218f0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
21900 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
21910 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
21920 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
21930 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
21940 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
21950 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
21960 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
21970 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
21980 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
21990 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
219a0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
219b0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
219c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
219d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
219e0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
219f0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
21a00 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
21a10 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
21a20 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
21a30 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
21a40 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
21a50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21a60 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
21a70 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
21a80 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
21a90 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
21aa0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
21ab0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
21ac0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
21ad0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
21ae0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
21af0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
21b00 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
21b10 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
21b20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
21b30 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
21b40 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
21b50 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
21b60 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
21b70 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
21b80 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
21b90 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
21ba0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
21bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
21bc0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
21bd0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
21be0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21bf0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
21c00 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
21c10 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
21c20 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
21c30 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
21c40 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62  (Pgno*)sqlite3Db
21c50 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
21c60 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65       pCur->pBtre
21c70 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76  e->db, pCur->aOv
21c80 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
21c90 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
21ca0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21cb0 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
21cc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21cd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
21ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21cf0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
21d00 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
21d10 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
21d20 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
21d30 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
21d40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
21d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21d60 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
21d70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
21d80 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
21d90 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
21da0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
21db0 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
21dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21dd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
21de0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21df0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
21e00 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
21e10 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
21e20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
21e30 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
21e40 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
21e50 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
21e60 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
21e70 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
21e80 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21e90 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
21ea0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
21eb0 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
21ec0 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
21ed0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
21ee0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
21ef0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
21f00 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21f10 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
21f20 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
21f30 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
21f40 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
21f50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
21f60 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
21f70 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
21f80 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
21f90 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
21fa0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
21fb0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
21fc0 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
21fd0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
21fe0 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
21ff0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
22000 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
22010 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
22020 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
22030 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
22040 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
22050 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
22060 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
22070 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
22080 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
22090 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
220a0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
220b0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
220c0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
220d0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
220e0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
220f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
22100 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
22110 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
22120 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
22130 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
22140 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
22150 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
22160 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
22170 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
22180 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
22190 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
221a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
221b0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
221c0 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
221d0 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f  hat the aOverflo
221e0 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62  w[] array must b
221f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61  e allocated beca
22200 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20  use eOp!=2.     
22210 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20     ** here.  If 
22220 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66  eOp==2, then off
22230 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20  set==0 and this 
22240 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20  branch is never 
22250 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a  taken..        *
22260 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22270 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20  ( eOp!=2 );.    
22280 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22290 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
222a0 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
222b0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
222c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
222d0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
222e0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
222f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
22300 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
22310 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
22320 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
22330 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
22340 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
22350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22360 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
22370 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
22380 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
22390 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
223a0 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
223b0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
223c0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
223d0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
223e0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
223f0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
22400 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
22410 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
22420 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
22430 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
22440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22450 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
22460 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
22470 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
22480 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
22490 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
224a0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
224b0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
224c0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
224d0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
224e0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
224f0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
22500 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22510 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
22520 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
22530 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
22540 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
22550 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
22560 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
22570 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
22580 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
22590 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
225a0 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
225b0 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
225c0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
225d0 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
225e0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
225f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
22600 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
22610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
22620 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
22630 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase,.        ** 
22640 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72    6) all data fr
22650 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62  om the page is b
22660 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20  eing read..     
22670 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
22680 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
22690 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
226a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
226b0 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
226c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
226d0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
226e0 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
226f0 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
22700 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
22710 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
22720 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
22730 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
22740 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
22750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22760 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d   if( (eOp&0x01)=
22770 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
227a0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
227b0 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
227f0 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20      && (bEnd || 
22800 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20  a==ovflSize)    
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
22830 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22840 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
22850 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22870 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
22880 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
22890 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
228a0 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
228b0 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
228c0 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
228d0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
228e0 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
22910 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22920 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
22930 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
22940 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
22950 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ];.          mem
22960 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
22970 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
22980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
22990 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
229a0 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
229b0 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
229c0 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
229d0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
229e0 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
229f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
22a00 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
22a10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
22a20 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
22a30 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
22a40 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
22a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22a60 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
22a70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
22a80 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
22a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
22aa0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20  (eOp&0x01)==0 ? 
22ab0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22ac0 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
22ad0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
22ae0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22b00 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
22b10 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
22b20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22b30 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
22b40 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
22b50 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
22b60 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
22b70 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
22b80 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  t+4], pBuf, a, (
22b90 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61  eOp&0x01), pDbPa
22ba0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22bc0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
22bd0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
22be0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
22bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22c00 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
22c10 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
22c20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22c30 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
22c40 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
22c50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22c60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22c70 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
22c80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
22c90 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
22ca0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
22cb0 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
22cc0 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
22cd0 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
22ce0 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
22cf0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
22d00 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
22d10 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
22d20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
22d30 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
22d40 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
22d50 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
22d60 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
22d70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
22d80 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22d90 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
22da0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
22db0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
22dc0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
22dd0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
22de0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
22df0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
22e00 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
22e10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22e20 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
22e30 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
22e40 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
22e50 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
22e60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22e70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22e80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
22e90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
22ea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22eb0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
22ec0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22ed0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
22ee0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22ef0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22f00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22f10 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22f20 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
22f30 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
22f40 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
22f50 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
22f60 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
22f70 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
22f80 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
22f90 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
22fa0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
22fb0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
22fc0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
22fd0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
22fe0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
22ff0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
23000 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
23010 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23020 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
23030 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
23040 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
23050 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
23060 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
23070 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
23080 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
23090 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
230a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
230b0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
230c0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
230d0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
230e0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
230f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23100 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
23110 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
23120 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
23130 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
23140 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
23150 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
23160 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23170 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23180 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
23190 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
231a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
231b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
231c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
231d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
231e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
231f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
23200 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23210 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
23220 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23230 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23240 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
23250 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
23260 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
23270 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
23280 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
23290 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
232a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
232b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
232c0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
232d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
232e0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
232f0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
23300 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
23310 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
23320 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
23330 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
23340 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
23350 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
23360 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
23370 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
23380 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
23390 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
233a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
233b0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
233c0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
233d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
233e0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
233f0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
23400 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
23410 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
23420 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
23430 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
23440 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
23450 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
23460 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
23470 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
23480 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
23490 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
234a0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
234b0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
234c0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
234d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
234e0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
234f0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
23500 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
23510 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
23520 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
23530 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
23540 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
23550 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
23560 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
23570 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
23580 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
23590 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
235a0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
235b0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
235c0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
235d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
235e0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
235f0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
23600 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
23610 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23620 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
23630 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
23640 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
23650 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
23660 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
23670 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
23680 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
23690 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
236a0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
236b0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
236c0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
236d0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
236e0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
236f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
23700 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
23710 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
23720 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
23730 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
23740 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
23750 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
23760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23770 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23780 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23790 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
237a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
237b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
237c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
237d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
237e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
237f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23800 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
23810 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23820 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
23830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
23840 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
23850 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  *pAmt = pCur->in
23860 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74  fo.nLocal;.  ret
23870 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
23880 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
23890 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
238a0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
238b0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
238c0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
238d0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
238e0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
238f0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
23900 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
23910 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
23920 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
23930 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
23940 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
23950 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
23960 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
23970 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
23980 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
23990 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
239a0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
239b0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
239c0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
239d0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
239e0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
239f0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
23a00 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
23a10 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
23a20 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
23a30 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
23a40 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
23a50 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
23a60 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
23a70 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
23a80 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
23a90 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
23aa0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
23ab0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
23ac0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
23ad0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
23ae0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
23af0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
23b00 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
23b10 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
23b20 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
23b30 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76  pAmt);.}.const v
23b40 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
23b50 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
23b60 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
23b70 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
23b80 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
23b90 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
23ba0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23bb0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
23bc0 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
23bd0 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
23be0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
23bf0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23c00 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
23c10 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
23c20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23c30 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
23c40 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
23c50 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
23c60 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
23c70 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
23c80 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
23c90 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
23ca0 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
23cb0 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
23cc0 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
23cd0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
23ce0 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
23cf0 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
23d00 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
23d10 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
23d20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23d30 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
23d40 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
23d50 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
23d60 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
23d70 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
23d80 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
23d90 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23da0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23db0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23dc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23dd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23de0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23df0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
23e00 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
23e10 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
23e20 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
23e30 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
23e40 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
23e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23e60 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23e70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
23e80 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
23e90 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
23ea0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
23eb0 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c      (pCur->curFl
23ec0 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
23ed0 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52  Flag)==0 ? PAGER
23ee0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
23ef0 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
23f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72  eturn rc;.  pCur
23f10 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20  ->apPage[i+1] = 
23f20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72  pNewPage;.  pCur
23f30 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30  ->aiIdx[i+1] = 0
23f40 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
23f50 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  +;..  pCur->info
23f60 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
23f70 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
23f80 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
23f90 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
23fa0 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
23fb0 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
23fc0 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
23fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
23fe0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
23ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24000 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
24010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24020 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
24030 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
24040 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
24050 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
24060 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
24070 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
24080 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
24090 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
240a0 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
240b0 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
240c0 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
240d0 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
240e0 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
240f0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
24100 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
24110 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
24120 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
24130 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
24140 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
24150 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
24160 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
24170 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
24180 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
24190 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
241a0 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
241b0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
241c0 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
241d0 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
241e0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
241f0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
24200 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
24210 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
24220 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
24230 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
24240 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
24250 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
24260 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
24270 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
24280 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
24290 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
242a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
242b0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
242c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
242d0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
242e0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
242f0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
24300 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
24310 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
24320 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
24330 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
24340 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
24350 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
24360 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
24370 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
24380 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
24390 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
243a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
243b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
243c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
243d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
243e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
243f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24400 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24410 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
24420 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
24430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24450 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a  >iPage] );..  /*
24460 20 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61   UPDATE: It is a
24470 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  ctually possible
24480 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69   for the conditi
24490 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65  on tested by the
244a0 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c   assert.  ** bel
244b0 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20  ow to be untrue 
244c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
244d0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
244e0 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20   This can occur 
244f0 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73  if.  ** one curs
24500 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20  or has modified 
24510 70 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69  page pParent whi
24520 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  le a reference t
24530 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20  o it is held .  
24540 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63  ** by a second c
24550 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e  ursor. Which can
24560 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
24570 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73  a single page is
24580 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74   linked.  ** int
24590 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
245a0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
245b0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
245c0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20  tabase.  */.#if 
245d0 30 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  0.  assertParent
245e0 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
245f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24600 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
24610 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24620 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
24630 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24640 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
24650 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74  );.#endif.  test
24660 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
24670 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
24680 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
24690 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
246a0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65  nCell );..  rele
246b0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
246c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
246d0 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
246e0 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
246f0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
24700 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
24710 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
24720 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
24730 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
24740 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
24750 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
24760 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
24770 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
24780 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
24790 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
247a0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
247b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
247c0 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
247d0 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
247e0 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
247f0 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
24800 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
24810 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
24820 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
24830 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
24840 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
24850 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
24860 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
24870 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
24880 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
24890 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
248a0 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
248b0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
248c0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
248d0 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
248e0 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
248f0 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
24900 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  D. Otherwise, th
24910 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
24920 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
24930 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f  first.** cell lo
24940 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
24950 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  t (or virtual ro
24960 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
24970 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a   cursor state.**
24980 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
24990 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
249a0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
249b0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
249c0 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
249d0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
249e0 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
249f0 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
24a00 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
24a10 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
24a20 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
24a30 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
24a40 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
24a50 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
24a60 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
24a70 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
24a80 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
24a90 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
24aa0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
24ab0 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
24ac0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
24ad0 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
24ae0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
24af0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
24b00 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
24b10 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
24b20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
24b30 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
24b40 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
24b50 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
24b60 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
24b70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24b80 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
24b90 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
24ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
24bb0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
24bc0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24bd0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24be0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
24bf0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24c00 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
24c10 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
24c20 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
24c30 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
24c40 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
24c50 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
24c60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
24c70 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
24c80 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
24c90 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
24ca0 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
24cb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24cc0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
24cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
24ce0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
24cf0 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
24d00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24d10 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
24d20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
24d30 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
24d40 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
24d50 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61 73 65  >iPage ) release
24d60 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
24d70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
24d80 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
24d90 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
24da0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
24db0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24dc0 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
24dd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
24de0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67  else{.    rc = g
24df0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
24e00 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
24e10 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
24e20 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
24e30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
24e40 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c      (pCur->curFl
24e50 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
24e60 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52  Flag)==0 ? PAGER
24e70 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
24e80 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
24e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24ea0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24eb0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
24ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24ed0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
24ee0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
24ef0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
24f00 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
24f10 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
24f20 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
24f30 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
24f40 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
24f50 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
24f60 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
24f70 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
24f80 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
24f90 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
24fa0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
24fb0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
24fc0 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
24fd0 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
24fe0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
24ff0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
25000 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
25010 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
25020 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
25030 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
25040 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
25050 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
25060 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
25070 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
25080 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
25090 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
250a0 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
250b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
250c0 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
250d0 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
250e0 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
250f0 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
25100 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
25110 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
25120 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
25130 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
25140 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
25150 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
25160 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
25170 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
25180 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
25190 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
251a0 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
251b0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
251c0 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
251d0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
251e0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
251f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25200 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25210 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49    }..  pCur->aiI
25220 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
25230 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
25240 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
25250 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
25260 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
25270 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
25280 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  fl);..  if( pRoo
25290 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
252a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
252b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
252c0 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
252d0 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
252e0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
252f0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
25300 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
25310 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25320 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
25330 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
25340 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
25350 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
25360 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
25370 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
25380 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
25390 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
253a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
253b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
253c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
253d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
253e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
253f0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
25400 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
25410 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
25420 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
25430 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
25440 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25450 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
25460 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
25470 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
25480 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
25490 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
254a0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
254b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
254c0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
254d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
254e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
254f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25500 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
25510 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25520 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25530 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25540 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25550 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25560 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
25570 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
25580 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
25590 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
255a0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
255b0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
255c0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
255d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
255e0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
255f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
25600 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25610 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
25620 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
25630 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
25640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25650 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
25660 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
25670 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
25680 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
25690 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
256a0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
256b0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
256c0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
256d0 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
256e0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
256f0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
25700 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
25710 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
25720 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
25730 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
25740 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
25750 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
25760 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
25770 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
25780 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
25790 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
257a0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
257b0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
257c0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
257d0 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
257e0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
257f0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
25800 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
25810 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
25820 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
25830 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
25840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
25850 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25860 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
25870 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25880 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25890 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
258a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
258b0 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
258c0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
258d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
258e0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
258f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
25900 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
25910 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
25920 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
25930 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
25940 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
25950 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
25960 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
25970 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25980 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
25990 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
259a0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
259b0 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
259c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
259d0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
259e0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
259f0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
25a00 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
25a10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25a20 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
25a30 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
25a40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
25a50 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
25a60 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
25a70 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
25a80 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
25a90 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
25aa0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
25ab0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
25ac0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
25ad0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
25ae0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25af0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
25b00 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
25b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
25b20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25b30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25b40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25b50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25b60 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
25b70 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
25b80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
25b90 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
25bb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25bc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
25bd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25be0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25bf0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25c00 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25c10 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
25c20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
25c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25c40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
25c50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25c60 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
25c70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
25c80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
25c90 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
25ca0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
25cc0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
25cd0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
25ce0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
25cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
25d00 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
25d10 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
25d20 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
25d30 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
25d40 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
25d50 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
25d60 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25d70 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
25d80 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
25d90 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
25da0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
25db0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
25dc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25dd0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25de0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25df0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25e00 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25e10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
25e20 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
25e30 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
25e40 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
25e50 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
25e60 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
25e70 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70  ur->eState && (p
25e80 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25e90 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
25ea0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
25eb0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
25ec0 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
25ed0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
25ee0 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
25ef0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
25f00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
25f10 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
25f20 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
25f30 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
25f40 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
25f50 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
25f60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25f70 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
25f80 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
25f90 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
25fa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25fb0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
25fc0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
25fd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25fe0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
25ff0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
26000 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
26010 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
26020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26030 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
26040 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
26050 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
26070 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
26080 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
26090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
260a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
260b0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
260c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
260d0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
260e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
260f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
26100 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
26110 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
26120 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
26130 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
26140 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
26150 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ur);.      if( r
26160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26170 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
26180 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41  rFlags |= BTCF_A
26190 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  tLast;.      }el
261a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72  se{.        pCur
261b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
261c0 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
261d0 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20    }.   .    }.  
261e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
261f0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
26200 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
26210 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
26220 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
26230 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
26240 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
26250 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
26260 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
26270 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
26280 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
26290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
262a0 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
262b0 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
262c0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
262d0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
262e0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
262f0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
26300 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
26310 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
26320 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
26330 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
26340 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
26350 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
26360 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
26370 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
26380 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
26390 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
263a0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
263b0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
263c0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
263d0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
263e0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
263f0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
26400 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
26410 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
26420 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
26430 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
26440 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
26450 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
26460 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
26470 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
26480 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
26490 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
264a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
264b0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
264c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
264d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
264e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
264f0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
26500 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
26510 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
26520 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
26530 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
26540 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
26550 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
26560 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
26570 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
26580 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
26590 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
265a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
265b0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
265e0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
265f0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
26600 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
26610 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
26620 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
26630 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
26640 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
26650 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
26660 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
26670 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
26680 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
26690 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
266a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
266b0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
266c0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
266d0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
266e0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
266f0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
26700 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
26710 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
26720 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
26730 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
26740 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
26750 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
26760 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
26770 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26790 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
267a0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
267b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
267c0 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
267d0 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
267e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
267f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26800 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26810 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
26820 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
26830 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
26840 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
26850 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
26860 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
26870 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
26880 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
26890 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
268a0 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
268b0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
268c0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
268d0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
268e0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
268f0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
26900 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26910 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
26920 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
26930 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
26940 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  =0.   && pCur->a
26950 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
26960 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
26970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
26980 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26990 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
269a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
269b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
269c0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
269d0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
269e0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  =0 && pCur->info
269f0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
26a00 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
26a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26a30 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
26a40 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
26a50 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
26a60 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
26a70 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
26a80 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
26a90 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
26aa0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
26ab0 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
26ac0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
26ad0 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
26ae0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
26af0 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
26b00 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
26b10 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
26b20 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
26b30 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
26b40 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
26b50 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
26b60 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
26b70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26b80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
26b90 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26ba0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26bb0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
26bc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26bd0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
26be0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26bf0 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20  >iPage]->isInit 
26c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26c10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26c20 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
26c30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26c40 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
26c50 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
26c60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
26c70 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
26c80 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
26c90 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
26ca0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
26cb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26cc0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
26cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26ce0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
26cf0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
26d00 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
26d10 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
26d20 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
26d30 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
26d40 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
26d50 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
26d60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
26d70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
26d80 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20  .    u8 *pCell; 
26d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26da0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
26db0 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
26dc0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
26dd0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
26de0 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
26df0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
26e00 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
26e10 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
26e20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
26e30 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
26e40 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
26e50 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
26e60 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
26e70 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
26e80 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
26e90 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
26ea0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
26eb0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
26ec0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
26ed0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
26ee0 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
26ef0 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
26f00 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
26f10 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
26f20 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
26f30 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
26f40 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
26f50 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
26f60 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
26f70 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
26f80 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
26f90 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
26fa0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
26fb0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
26fc0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
26fd0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
26fe0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
26ff0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65  Cell-1;.    asse
27000 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30  rt( biasRight==0
27010 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31   || biasRight==1
27020 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70   );.    idx = up
27030 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29  r>>(1-biasRight)
27040 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52  ; /* idx = biasR
27050 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77  ight ? upr : (lw
27060 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
27070 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27080 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27090 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52  )idx;.    if( xR
270a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20  ecordCompare==0 
270b0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  ){.      for(;;)
270c0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
270d0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
270e0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
270f0 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
27100 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
27110 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
27120 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
27130 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
27140 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
27150 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
27160 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
27170 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
27180 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
27190 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
271a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
271b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
271c0 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
271d0 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
271e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
271f0 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
27200 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
27210 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
27220 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
27230 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
27240 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
27250 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
27260 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
27270 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
27280 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
27290 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
272a0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
272b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
272c0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
272d0 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
272e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
272f0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
27300 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20  lidNKey;.       
27310 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
27320 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
27330 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
27340 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27350 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
27360 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
27370 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27380 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
27390 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
273a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
273b0 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
273c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
273d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
273e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
273f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27400 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
27410 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
27420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27430 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27440 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
27450 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
27460 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
27470 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
27480 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
27490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
274a0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
274b0 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20  nt nCell;.      
274c0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
274d0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
274e0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
274f0 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Size;..        /
27500 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
27510 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
27520 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
27530 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
27540 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
27550 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
27560 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
27570 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
27580 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
27590 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
275a0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
275b0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
275c0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
275d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
275e0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
275f0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
27600 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
27610 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
27620 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
27630 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
27640 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
27650 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
27660 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
27670 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
27680 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
27690 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
276a0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
276b0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
276c0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
276d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
276e0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
276f0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
27700 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
27710 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
27720 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
27730 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
27740 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
27750 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
27760 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
27770 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
27780 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
27790 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
277a0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
277b0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
277c0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
277d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
277e0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
277f0 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
27800 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
27810 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
27820 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
27830 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
27840 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
27850 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
27860 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
27870 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
27880 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
27890 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
278a0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
278b0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
278c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
278d0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
278e0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
278f0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
27900 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
27910 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
27920 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
27930 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
27940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
27950 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
27960 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
27970 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
27980 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
27990 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
279a0 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
279b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
279c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
279d0 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
279e0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
279f0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
27a00 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
27a10 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
27a20 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
27a30 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
27a40 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
27a50 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
27a60 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
27a70 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
27a80 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
27a90 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
27aa0 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
27ab0 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
27ac0 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
27ad0 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  alled. */.      
27ae0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
27af0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
27b00 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
27b10 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
27b20 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
27b30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  ;.          btre
27b40 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
27b50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
27b60 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
27b70 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
27b80 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
27b90 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
27ba0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
27bb0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
27bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27bd0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
27be0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27bf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
27c00 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27c10 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27c20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c30 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
27c40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27c50 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
27c60 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
27c70 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
27c80 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
27c90 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
27ca0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   2);.          i
27cb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
27cc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27cd0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
27ce0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
27cf0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
27d00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27d10 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
27d20 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
27d30 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
27d40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27d50 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
27d60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
27d70 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
27d80 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
27d90 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
27da0 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
27db0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
27dc0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
27dd0 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
27de0 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
27df0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
27e00 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
27e10 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
27e20 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
27e30 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
27e40 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
27e50 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
27e60 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
27e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27e80 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
27e90 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
27ea0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
27eb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27ec0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
27ed0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27ee0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
27ef0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
27f00 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
27f10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
27f20 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
27f30 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27f40 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
27f50 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
27f60 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
27f70 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
27f80 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
27f90 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
27fa0 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
27fb0 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
27fc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27fd0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
27fe0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
27ff0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
28000 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
28010 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
28020 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
28030 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28040 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28050 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28060 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
28070 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28080 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
28090 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
280a0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
280b0 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
280c0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
280d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
280e0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
280f0 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
28100 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
28110 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
28120 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
28130 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
28140 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28150 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28160 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
28170 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
28180 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28190 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
281a0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
281b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
281c0 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
281d0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
281e0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
281f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28200 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
28210 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
28220 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
28230 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
28240 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
28250 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
28260 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e  dOvfl);.  return
28270 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
28280 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
28290 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
282a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
282b0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
282c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
282d0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
282e0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
282f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
28300 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
28310 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
28320 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
28330 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
28340 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
28350 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
28360 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
28370 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
28380 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
28390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
283a0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
283b0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
283c0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
283d0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
283e0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
283f0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
28400 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
28410 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
28420 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
28430 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
28440 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
28450 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
28460 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
28470 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
28480 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
28490 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
284a0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
284b0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
284c0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
284d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
284e0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
284f0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
28500 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
28510 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
28520 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
28530 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
28540 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
28550 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
28560 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
28570 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
28580 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
28590 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
285a0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
285b0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
285c0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
285d0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
285e0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
285f0 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
28600 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
28610 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
28620 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
28630 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
28640 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
28650 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
28660 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
28670 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28680 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
28690 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
286a0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
286b0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
286c0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
286d0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
286e0 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
286f0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
28700 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
28710 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
28720 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
28730 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
28740 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
28750 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
28760 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
28770 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
28780 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
28790 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
287a0 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
287b0 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
287c0 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
287d0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
287e0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
287f0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
28800 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
28810 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
28820 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
28830 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
28840 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
28850 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
28860 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
28870 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
28880 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
28890 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
288a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
288b0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
288c0 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
288d0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
288e0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
288f0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
28900 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
28910 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74  NE int btreeNext
28920 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28930 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
28940 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
28950 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
28960 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
28970 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28980 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28990 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
289a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
289b0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
289c0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
289d0 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66  *pRes==0 );.  if
289e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
289f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
28a00 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
28a10 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
28a20 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
28a30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
28a40 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
28a50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
28a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28a70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
28a80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
28a90 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28aa0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
28ab0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28ac0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
28ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
28ae0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
28af0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
28b00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28b10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28b20 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
28b30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
28b40 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
28b50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28b60 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
28b70 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
28b80 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
28b90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28ba0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
28bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
28bd0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
28be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
28bf0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28c00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
28c10 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
28c20 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28c30 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
28c40 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
28c50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
28c60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
28c70 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
28c80 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
28c90 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
28ca0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
28cb0 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
28cc0 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
28cd0 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
28ce0 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
28cf0 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
28d00 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
28d10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
28d20 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
28d30 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
28d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28d50 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
28d60 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
28d70 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
28d80 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
28d90 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
28da0 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
28db0 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
28dc0 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
28dd0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
28de0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
28df0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
28e00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
28e10 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
28e20 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28e30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
28e40 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
28e50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
28e60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
28e70 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
28e80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
28e90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
28ea0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
28eb0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
28ec0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
28ed0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28ee0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
28ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28f10 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
28f20 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
28f30 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28f40 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
28f50 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
28f60 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28f70 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
28f80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
28f90 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
28fa0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
28fb0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
28fc0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
28fd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
28fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
28ff0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
29000 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
29010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
29030 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
29040 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
29050 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
29060 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
29070 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
29080 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29090 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
290a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
290b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
290c0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
290d0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
290e0 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
290f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
29100 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
29110 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
29120 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
29130 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29140 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29150 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
29160 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29170 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20  dOvfl);.  *pRes 
29180 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
29190 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
291a0 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
291b0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
291c0 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Res);.  pPage = 
291d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
291e0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
291f0 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b   (++pCur->aiIdx[
29200 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70  pCur->iPage])>=p
29210 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
29220 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29230 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
29240 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
29250 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
29260 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
29270 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
29280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
292a0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
292b0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
292c0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
292d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
292e0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
292f0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
29300 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
29310 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
29320 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
29330 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
29340 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
29350 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
29360 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
29370 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
29380 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
29390 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
293a0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
293b0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
293c0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
293d0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
293e0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
293f0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
29400 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
29410 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
29420 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
29430 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
29440 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
29450 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
29460 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
29470 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
29480 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
29490 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
294a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
294b0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
294c0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
294d0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
294e0 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
294f0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
29500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
29510 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ng function will
29520 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   set *pRes to 0 
29530 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69  or 1.  The initi
29540 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a  al *pRes value.*
29550 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74  * will be 1 if t
29560 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20  he cursor being 
29570 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f  stepped correspo
29580 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
29590 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  dex and.** if th
295a0 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
295b0 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
295c0 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69  ed if that SQL i
295d0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a  ndex had been.**
295e0 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
295f0 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20    Otherwise the 
29600 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65  caller will have
29610 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65   set *pRes to ze
29620 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74  ro..** Zero is t
29630 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20  he common case. 
29640 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  The btree implem
29650 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65  entation is free
29660 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69   to use the.** i
29670 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
29680 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20  ue as a hint to 
29690 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61  improve performa
296a0 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72  nce, but the cur
296b0 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62  rent.** SQLite b
296c0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
296d0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e  ion does not. (N
296e0 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ote that the com
296f0 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70  db2 btree.** imp
29700 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
29710 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
29720 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61  however.).*/.sta
29730 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
29740 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
29750 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
29760 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
29770 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
29780 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
29790 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
297a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
297b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
297c0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
297d0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
297e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
297f0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
29800 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
29810 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
29820 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
29830 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
29840 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
29850 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
29860 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
29870 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
29880 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
29890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
298a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
298b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
298c0 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
298d0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
298e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73     rc = btreeRes
298f0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
29900 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
29910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29920 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29930 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
29940 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
29950 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
29960 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
29970 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
29980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
29990 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
299a0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
299b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
299c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
299d0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
299e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
299f0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
29a00 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29a10 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
29a20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
29a30 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
29a40 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
29a50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
29a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
29a80 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
29a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
29aa0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29ab0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
29ac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29ad0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
29ae0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
29af0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
29b00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29b10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
29b20 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
29b30 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
29b40 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
29b50 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
29b60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29b70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
29b80 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
29b90 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
29ba0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29bb0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
29bc0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
29bd0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
29be0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
29bf0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
29c00 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
29c10 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
29c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
29c40 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
29c50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
29c60 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29c70 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
29c80 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
29c90 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
29ca0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
29cb0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
29cc0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
29cd0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
29ce0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
29cf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29d00 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
29d10 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
29d20 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
29d30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
29d40 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
29d50 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
29d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29d70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29d80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
29d90 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
29da0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
29db0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
29dc0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
29dd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29de0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
29e00 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
29e10 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
29e20 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
29e30 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
29e40 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
29e50 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29e60 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
29e70 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
29e80 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
29e90 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
29ea0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
29eb0 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
29ec0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
29ed0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
29ee0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
29ef0 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
29f00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
29f10 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
29f20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29f30 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
29f40 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
29f50 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
29f60 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
29f70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29f80 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
29f90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29fa0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
29fb0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
29fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
29fd0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
29fe0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
29ff0 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2a000 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2a010 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2a020 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2a030 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2a040 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2a050 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2a060 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2a070 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2a080 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2a090 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2a0a0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2a0b0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2a0c0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2a0d0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2a0e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2a0f0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2a100 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2a110 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2a120 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2a130 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
2a140 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
2a150 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
2a160 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2a170 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
2a180 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
2a190 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
2a1a0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
2a1b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2a1c0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
2a1d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2a1e0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
2a1f0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
2a200 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
2a210 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
2a220 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
2a230 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
2a240 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
2a250 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
2a260 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
2a270 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
2a280 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2a290 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
2a2a0 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
2a2b0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2a2c0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
2a2d0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
2a2e0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
2a2f0 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
2a300 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
2a310 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
2a320 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2a330 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
2a340 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
2a350 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
2a360 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
2a370 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
2a380 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
2a390 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2a3a0 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
2a3b0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
2a3c0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
2a3d0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
2a3e0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
2a3f0 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
2a400 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
2a410 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2a420 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2a430 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
2a440 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2a450 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
2a460 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
2a470 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
2a480 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
2a490 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
2a4a0 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
2a4b0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
2a4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2a4d0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
2a4e0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
2a4f0 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
2a500 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2a510 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
2a520 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
2a530 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
2a540 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
2a550 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
2a560 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
2a570 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2a580 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
2a590 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
2a5a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2a5b0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2a5c0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
2a5d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2a5e0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
2a5f0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
2a600 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
2a610 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
2a620 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
2a630 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
2a640 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
2a650 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
2a660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2a670 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2a680 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a690 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a6a0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
2a6b0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
2a6c0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
2a6d0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
2a6e0 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
2a6f0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2a700 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
2a710 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2a720 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  t);.  n = get4by
2a730 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2a740 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2a750 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2a760 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2a770 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2a780 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a790 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2a7a0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2a7b0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2a7c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2a7d0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2a7e0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2a7f0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2a800 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2a810 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2a820 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2a830 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2a840 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
2a850 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
2a860 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2a870 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
2a880 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2a890 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
2a8a0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2a8b0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
2a8c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2a8d0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
2a8e0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
2a8f0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2a900 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
2a910 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2a920 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2a930 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
2a940 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
2a950 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
2a960 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
2a970 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2a980 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a990 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
2a9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2a9b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2a9c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2a9d0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
2a9e0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
2a9f0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2aa00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2aa10 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
2aa20 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2aa30 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2aa40 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
2aa50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2aa60 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
2aa70 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2aa80 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2aa90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
2aaa0 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
2aab0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
2aac0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
2aad0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
2aae0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
2aaf0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
2ab00 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2ab10 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
2ab20 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
2ab30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2ab40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2ab50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2ab60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ab70 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
2ab80 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2ab90 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
2aba0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
2abb0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
2abc0 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
2abd0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
2abe0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
2abf0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
2ac00 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2ac10 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
2ac20 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
2ac30 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
2ac40 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
2ac50 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2ac60 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2ac70 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
2ac80 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
2ac90 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
2aca0 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
2acb0 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2acc0 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
2acd0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2ace0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
2acf0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
2ad00 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2ad10 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2ad20 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2ad30 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
2ad40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ad50 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2ad60 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2ad70 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
2ad80 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
2ad90 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
2ada0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
2adb0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
2adc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2add0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ade0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2adf0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2ae00 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2ae10 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2ae20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ae30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2ae40 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2ae50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ae60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2ae70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2ae80 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
2ae90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2aea0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
2aeb0 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67   );..      k = g
2aec0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2aed0 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23  >aData[4]); /* #
2aee0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
2aef0 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  is trunk page */
2af00 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2af10 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2af20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2af30 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2af40 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2af50 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2af60 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2af70 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2af80 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2af90 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2afa0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2afb0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2afc0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2afd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2afe0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2aff0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b000 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2b010 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2b020 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b030 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2b040 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2b050 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b060 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2b070 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2b080 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2b090 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2b0a0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2b0b0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2b0c0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2b0d0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2b0e0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2b0f0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2b100 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2b110 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2b120 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2b130 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2b140 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2b150 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2b160 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2b170 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2b180 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2b190 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2b1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b1b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2b1c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2b1d0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2b1e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b1f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2b200 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2b210 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2b220 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2b230 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2b240 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2b250 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2b260 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b270 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2b280 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2b290 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2b2a0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2b2b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2b2c0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2b2d0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2b2e0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2b2f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2b300 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2b310 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2b320 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2b330 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2b340 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b350 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b360 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2b370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2b390 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2b3a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2b3b0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2b3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2b3d0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2b3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2b3f0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2b400 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2b410 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2b420 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b430 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b450 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2b460 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b470 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b490 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b4a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b4c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2b4d0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2b4e0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2b4f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2b500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b520 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2b530 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2b540 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2b550 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2b560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2b570 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2b580 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2b590 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2b5a0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2b5b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2b5c0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2b5d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b5e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2b5f0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2b600 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2b610 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2b620 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2b630 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2b640 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2b650 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b660 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2b670 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2b680 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2b690 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2b6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b6b0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2b6c0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2b6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2b6e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2b6f0 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
2b700 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
2b710 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2b720 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b730 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2b740 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2b750 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b760 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b770 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2b780 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2b790 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b7a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b7b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
2b7c0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
2b7d0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
2b7e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b7f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b800 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
2b810 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
2b820 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2b830 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2b840 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
2b850 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
2b860 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
2b870 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2b880 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2b890 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
2b8a0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
2b8b0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
2b8c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2b8d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2b8e0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2b8f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2b900 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2b910 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b920 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2b930 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
2b940 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2b950 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
2b960 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2b970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b980 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2b990 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2b9a0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2b9b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2b9c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2b9d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b9e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ba00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2ba10 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2ba20 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
2ba30 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2ba40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ba50 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2ba60 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2ba70 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2ba80 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2ba90 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2baa0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
2bab0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
2bac0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
2bad0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
2bae0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
2baf0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
2bb00 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
2bb10 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
2bb20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
2bb30 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
2bb40 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
2bb50 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
2bb60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
2bb70 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
2bb80 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2bb90 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
2bba0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2bbb0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
2bbc0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
2bbe0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2bbf0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bc10 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
2bc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc30 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
2bc50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2bc60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2bc70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
2bc80 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2bc90 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
2bca0 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
2bcb0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
2bcc0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
2bcd0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2bce0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2bcf0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2bd00 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
2bd10 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2bd20 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2bd30 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
2bd40 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
2bd50 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
2bd60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2bd70 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd90 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
2bda0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bdb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bdc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2bdd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
2bde0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2bdf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
2be00 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2be10 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
2be20 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
2be30 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2be40 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2be50 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
2be60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2be70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2be80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2be90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2bea0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2beb0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
2bec0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2bed0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2bee0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a  f( !searchList .
2bef0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61           || (iPa
2bf00 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69  ge==nearby || (i
2bf10 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65  Page<nearby && e
2bf20 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2bf30 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  )) .        ){. 
2bf40 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
2bf50 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
2bf60 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
2bf70 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
2bf80 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2bf90 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
2bfa0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfc0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
2bfd0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
2bff0 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
2c000 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
2c010 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
2c020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c030 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2c040 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2c050 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2c060 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2c070 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
2c080 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
2c090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
2c0a0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
2c0b0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
2c0c0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
2c0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c0e0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
2c0f0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
2c100 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
2c110 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
2c120 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
2c130 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  no)? PAGER_GET_N
2c140 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2c150 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2c160 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2c170 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2c180 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2c190 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c1a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c1b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c1c0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2c1d0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2c1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2c1f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c210 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2c220 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2c230 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2c240 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2c250 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2c260 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c270 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c280 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2c290 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2c2a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2c2b0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2c2c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2c2d0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2c2e0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2c2f0 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2c300 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2c310 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2c320 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2c330 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2c340 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2c350 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2c360 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2c370 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2c380 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2c390 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2c3a0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2c3b0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2c3c0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2c3d0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2c3e0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2c3f0 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2c400 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2c410 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2c420 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2c430 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2c440 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2c450 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2c460 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2c470 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2c480 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2c490 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2c4a0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2c4b0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2c4c0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2c4d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2c4e0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2c4f0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2c500 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2c510 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2c520 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2c530 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2c540 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2c550 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2c560 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2c570 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2c580 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2c590 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2c5a0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2c5b0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2c5c0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2c5d0 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2c5e0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2c5f0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2c600 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2c610 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2c620 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2c630 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2c640 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2c650 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2c660 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2c670 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2c680 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2c690 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2c6a0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2c6b0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2c6c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c6d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2c6e0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2c6f0 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2c700 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2c710 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2c720 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
2c730 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c740 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
2c750 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c760 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2c770 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
2c780 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
2c790 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
2c7a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2c7b0 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
2c7c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c7d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2c7e0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
2c7f0 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
2c800 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2c810 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
2c820 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
2c830 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
2c840 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
2c850 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
2c860 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
2c870 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2c880 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
2c890 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
2c8a0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
2c8b0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
2c8c0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
2c8d0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
2c8e0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
2c8f0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
2c900 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
2c910 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
2c920 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2c930 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2c940 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
2c950 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
2c960 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
2c970 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
2c980 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
2c990 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2c9a0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2c9b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42 74  GetPage(pBt, pBt
2c9c0 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
2c9d0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2c9e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c9f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2ca00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ca10 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
2ca20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
2ca30 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
2ca40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2ca50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ca60 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
2ca70 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
2ca80 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2ca90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2caa0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
2cab0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
2cac0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
2cad0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
2cae0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
2caf0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
2cb00 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
2cb10 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
2cb20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
2cb30 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2cb40 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2cb50 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2cb60 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f  gno, ppPage, bNo
2cb70 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66  Content);.    if
2cb80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2cb90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2cba0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2cbb0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2cbc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2cbd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cbe0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2cbf0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2cc00 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2cc10 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2cc20 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
2cc30 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
2cc40 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2cc50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2cc60 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
2cc70 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
2cc80 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2cc90 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2cca0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
2ccb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ccc0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2ccd0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2cce0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
2ccf0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
2cd00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2cd10 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
2cd20 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
2cd30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cd40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2cd50 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
2cd60 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
2cd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
2cd80 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  age = 0;.  }.  a
2cd90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2cda0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
2cdb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2cdc0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2cdd0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
2cde0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2cdf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2ce00 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
2ce10 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
2ce20 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
2ce30 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
2ce40 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
2ce50 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2ce60 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
2ce70 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
2ce80 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
2ce90 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2cea0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2ceb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
2cec0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
2ced0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
2cee0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
2cef0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
2cf00 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
2cf10 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2cf20 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
2cf30 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
2cf40 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
2cf50 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
2cf60 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
2cf70 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
2cf80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
2cf90 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
2cfa0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2cfb0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
2cfc0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
2cfd0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
2cfe0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
2cff0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2d000 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
2d010 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
2d020 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
2d030 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
2d040 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2d050 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d060 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
2d070 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
2d080 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
2d090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d0a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2d0b0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
2d0c0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
2d0d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d0e0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2d0f0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
2d100 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2d110 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
2d120 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2d130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d140 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
2d150 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
2d160 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d180 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d190 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
2d1a0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
2d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d1c0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2d1d0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
2d1e0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
2d1f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d200 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2d210 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2d220 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
2d230 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
2d240 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
2d250 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
2d260 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
2d270 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
2d280 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
2d290 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
2d2a0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
2d2b0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
2d2c0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2d2d0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
2d2e0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
2d2f0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
2d300 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
2d310 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2d320 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
2d330 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2d340 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2d350 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
2d360 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
2d370 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
2d380 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2d390 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2d3a0 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
2d3b0 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
2d3c0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2d3d0 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ETE ){.    /* If
2d3e0 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
2d3f0 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
2d400 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
2d410 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
2d420 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
2d430 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
2d440 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
2d450 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
2d460 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
2d470 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2d480 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
2d490 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
2d4a0 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
2d4b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d4c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d4d0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
2d4e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2d4f0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2d500 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
2d510 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
2d520 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2d530 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2d540 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2d550 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
2d560 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2d570 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2d580 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
2d590 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
2d5a0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
2d5b0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2d5c0 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
2d5d0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
2d5e0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2d5f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
2d600 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2d610 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
2d620 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
2d630 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
2d640 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
2d650 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
2d660 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
2d670 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
2d680 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2d690 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
2d6a0 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
2d6b0 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
2d6c0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2d6d0 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
2d6e0 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
2d6f0 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
2d700 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2d710 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2d720 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
2d730 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
2d740 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2d750 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
2d760 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
2d770 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
2d780 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
2d790 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2d7a0 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
2d7b0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
2d7c0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
2d7d0 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
2d7e0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2d7f0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2d800 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
2d810 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
2d820 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
2d830 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2d840 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2d850 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2d860 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
2d870 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2d880 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d8a0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2d8b0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
2d8c0 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
2d8d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2d8e0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2d8f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
2d900 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
2d910 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
2d920 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2d930 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
2d940 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2d950 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
2d960 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2d970 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
2d980 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
2d990 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
2d9a0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
2d9b0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
2d9c0 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
2d9d0 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
2d9e0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
2d9f0 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
2da00 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
2da10 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2da20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
2da30 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
2da40 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
2da50 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
2da60 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
2da70 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
2da80 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
2da90 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
2daa0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
2dab0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
2dac0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
2dad0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
2dae0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
2daf0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
2db00 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
2db10 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
2db20 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
2db30 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
2db40 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
2db50 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
2db60 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
2db70 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
2db80 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
2db90 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
2dba0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
2dbb0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
2dbc0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
2dbd0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
2dbe0 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
2dbf0 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
2dc00 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
2dc10 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
2dc20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
2dc30 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
2dc40 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
2dc50 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
2dc60 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
2dc70 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
2dc80 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
2dc90 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
2dca0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
2dcb0 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
2dcc0 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
2dcd0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
2dce0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
2dcf0 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
2dd00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2dd10 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2dd20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2dd30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2dd40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2dd50 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2dd60 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
2dd70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
2dd80 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2dd90 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
2dda0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
2ddb0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
2ddc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2ddd0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
2dde0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2ddf0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
2de00 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
2de10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2de20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
2de30 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
2de40 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
2de50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
2de60 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2de70 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
2de80 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
2de90 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
2dea0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
2deb0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2dec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2ded0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
2dee0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
2def0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
2df00 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
2df10 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
2df20 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
2df30 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
2df40 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
2df50 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2df60 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
2df70 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
2df80 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
2df90 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
2dfa0 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
2dfb0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2dfc0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2dfd0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
2dfe0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
2dff0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
2e000 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
2e010 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2e020 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2e030 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
2e040 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
2e050 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
2e060 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
2e070 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
2e080 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
2e090 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2e0a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e0b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2e0c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2e0d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e0e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2e0f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
2e100 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
2e110 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
2e120 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2e130 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
2e140 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2e150 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
2e160 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
2e170 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
2e180 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
2e190 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
2e1a0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
2e1b0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
2e1c0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
2e1d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
2e1e0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
2e1f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e200 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2e210 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
2e220 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
2e230 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
2e240 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2e250 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
2e260 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
2e270 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
2e280 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
2e290 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
2e2a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
2e2b0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
2e2c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
2e2d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2e2e0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
2e2f0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
2e300 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
2e310 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e320 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
2e330 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
2e340 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
2e350 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
2e360 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
2e370 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2e380 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
2e390 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2e3a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
2e3b0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2e3c0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2e3d0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
2e3e0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
2e3f0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
2e400 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2e410 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2e420 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
2e430 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e440 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2e450 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2e460 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
2e470 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2e480 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
2e490 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
2e4a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2e4b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2e4c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2e4d0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2e4e0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2e4f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
2e500 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
2e510 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2e520 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2e530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e540 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2e550 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2e560 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2e570 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2e580 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2e590 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2e5a0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2e5b0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2e5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e5d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
2e5e0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2e5f0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2e600 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2e610 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2e620 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2e630 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2e640 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e650 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2e660 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2e670 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2e680 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2e690 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2e6a0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2e6b0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2e6c0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2e6d0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2e6e0 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2e6f0 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2e700 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2e710 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2e720 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2e730 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2e740 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2e750 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2e760 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2e770 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2e780 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2e790 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2e7a0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2e7b0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2e7c0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2e7d0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2e7e0 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2e7f0 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2e800 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2e810 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2e820 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e830 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2e840 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2e850 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2e860 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2e870 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2e880 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2e890 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e8a0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2e8b0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2e8c0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2e8d0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2e8e0 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2e8f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2e900 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2e910 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2e920 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2e930 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2e940 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2e950 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2e960 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2e970 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2e980 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2e990 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2e9a0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2e9b0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2e9c0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2e9d0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2e9e0 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2e9f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2ea00 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2ea10 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2ea20 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2ea30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2ea40 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2ea50 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2ea60 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2ea70 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2ea80 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2ea90 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2eaa0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2eab0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2eac0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2ead0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2eae0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2eaf0 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2eb00 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2eb10 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2eb20 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2eb30 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2eb40 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2eb50 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2eb60 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2eb70 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2eb80 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2eb90 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2eba0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2ebb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ebc0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2ebd0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2ebe0 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2ebf0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2ec00 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2ec10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ec20 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2ec30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ec40 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2ec50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2ec60 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2ec70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2ec80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2ec90 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2eca0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2ecb0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2ecc0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2ecd0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2ece0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2ecf0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2ed00 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2ed10 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2ed20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2ed30 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2ed40 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2ed50 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2ed60 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2ed70 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2ed80 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2ed90 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2eda0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2edb0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2edc0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2edd0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2ede0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2edf0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2ee00 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2ee10 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2ee20 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2ee30 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2ee40 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2ee50 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2ee60 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2ee70 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2ee80 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2ee90 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2eea0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2eeb0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2eec0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2eed0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2eee0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2eef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2ef00 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2ef10 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2ef20 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2ef30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2ef40 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2ef50 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2ef60 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2ef70 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2ef80 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2ef90 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2efb0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2efc0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2efd0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2efe0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2eff0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2f000 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2f010 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2f020 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2f030 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2f040 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2f050 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2f060 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2f070 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2f080 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2f090 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2f0a0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2f0b0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2f0c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f0d0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2f0e0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2f0f0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2f100 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
2f110 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f120 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2f130 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
2f140 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
2f150 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
2f160 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
2f170 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
2f180 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
2f190 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
2f1a0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
2f1b0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
2f1c0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
2f1d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2f1e0 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
2f1f0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2f200 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2f210 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2f220 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2f230 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2f240 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2f250 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
2f260 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
2f270 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
2f280 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2f290 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2f2a0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
2f2b0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2f2c0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
2f2d0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
2f2e0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
2f2f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e{.    assert( n
2f300 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Data==0 );.    a
2f310 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20  ssert( nZero==0 
2f320 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  );.  }.  nHeader
2f330 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
2f340 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
2f350 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
2f360 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2f370 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a  e payload size *
2f380 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  /.  if( pPage->i
2f390 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
2f3a0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
2f3b0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2f3c0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
2f3d0 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
2f3e0 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
2f3f0 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
2f400 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f410 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f420 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2f430 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e  Payload = (int)n
2f440 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
2f450 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
2f460 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
2f470 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
2f480 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
2f490 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  ){.    n = nHead
2f4a0 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
2f4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2f4c0 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
2f4d0 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
2f4e0 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
2f4f0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
2f500 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
2f510 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
2f520 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20  Prior = pCell;. 
2f530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
2f540 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  mn = pPage->minL
2f550 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e  ocal;.    n = mn
2f560 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
2f570 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  n) % (pPage->pBt
2f580 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2f590 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2f5a0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
2f5b0 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
2f5c0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
2f5d0 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
2f5e0 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e   if( n > pPage->
2f5f0 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d  maxLocal ) n = m
2f600 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
2f610 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = n;.    *pnSiz
2f620 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20  e = n + nHeader 
2f630 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  + 4;.    pPrior 
2f640 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2f650 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c  +n];.  }.  pPayl
2f660 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2f670 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20  ader];..  /* At 
2f680 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61  this point varia
2f690 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  bles should be s
2f6a0 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  et as follows:. 
2f6b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c   **.  **   nPayl
2f6c0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f  oad           To
2f6d0 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  tal payload size
2f6e0 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20   in bytes.  **  
2f6f0 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   pPayload       
2f700 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e      Begin writin
2f710 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20  g payload here. 
2f720 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20   **   spaceLeft 
2f730 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61           Space a
2f740 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79  vailable at pPay
2f750 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f  load.  If nPaylo
2f760 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20  ad>spaceLeft,.  
2f770 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2f780 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61          that mea
2f790 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ns content must 
2f7a0 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66  spill into overf
2f7b0 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  low pages..  ** 
2f7c0 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20    *pnSize       
2f7d0 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65       Size of the
2f7e0 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74   local cell (not
2f7f0 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c   counting overfl
2f800 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20  ow pages).  **  
2f810 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20   pPrior         
2f820 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69      Where to wri
2f830 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74  te the pgno of t
2f840 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
2f850 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a  w page.  **.  **
2f860 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62   Use a call to b
2f870 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2f880 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  () to verify tha
2f890 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f  t the values abo
2f8a0 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d  ve.  ** were com
2f8b0 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  puted correctly.
2f8c0 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  .  */.#if SQLITE
2f8d0 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43  _DEBUG.  {.    C
2f8e0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2f8f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2f900 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2f910 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
2f920 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69  sert( nHeader=(i
2f930 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
2f940 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
2f950 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2f960 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20  Key==nKey );.   
2f970 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65   assert( *pnSize
2f980 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29   == info.nSize )
2f990 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70  ;.    assert( sp
2f9a0 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e  aceLeft == info.
2f9b0 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73  nLocal );.    as
2f9c0 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20  sert( pPrior == 
2f9d0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2f9e0 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65  rflow] );.  }.#e
2f9f0 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65  ndif..  /* Write
2fa00 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74   the payload int
2fa10 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c  o the local Cell
2fa20 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69   and any extra i
2fa30 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
2fa40 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  es */.  while( n
2fa50 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
2fa60 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
2fa70 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2fa80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2fa90 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
2faa0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
2fab0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
2fac0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
2fad0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
2fae0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2faf0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2fb00 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
2fb10 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
2fb20 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
2fb30 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
2fb40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2fb50 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
2fb60 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
2fb70 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
2fb80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2fb90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
2fba0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2fbb0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
2fbc0 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
2fbd0 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
2fbe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fbf0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2fc00 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2fc10 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2fc20 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
2fc30 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
2fc40 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
2fc50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
2fc60 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
2fc70 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
2fc80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2fc90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2fca0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
2fcb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2fcc0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
2fcd0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2fce0 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
2fcf0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
2fd00 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2fd10 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
2fd20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
2fd30 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
2fd40 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
2fd50 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
2fd60 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
2fd70 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
2fd80 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
2fd90 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
2fda0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
2fdb0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
2fdc0 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
2fdd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
2fde0 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
2fdf0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
2fe00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2fe10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2fe20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2fe30 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2fe40 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
2fe50 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
2fe60 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
2fe70 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
2fe80 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2fe90 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
2fea0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
2feb0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2fec0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2fed0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
2fee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fef0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2ff00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2ff10 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2ff20 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
2ff30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ff40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2ff50 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2ff60 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
2ff70 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
2ff80 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2ff90 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2ffa0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2ffb0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2ffc0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2ffd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2ffe0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2fff0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
30000 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
30010 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
30020 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
30030 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
30040 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
30050 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
30060 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
30070 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
30080 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
30090 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
300a0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
300b0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
300c0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
300d0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
300e0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
300f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30100 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
30110 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
30120 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
30130 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
30140 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
30150 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
30160 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
30170 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
30180 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
30190 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
301a0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
301b0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
301c0 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
301d0 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
301e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
301f0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
30200 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
30210 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
30220 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
30230 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
30240 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
30250 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
30260 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
30270 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
30280 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
30290 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
302a0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
302b0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
302c0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
302d0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
302e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
302f0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
30300 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
30310 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
30320 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
30330 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
30340 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
30350 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
30360 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
30370 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
30380 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
30390 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
303a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
303b0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
303c0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
303d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
303e0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
303f0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
30400 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
30410 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
30420 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
30430 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
30440 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
30450 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
30460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
30470 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
30480 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
30490 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
304a0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
304b0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
304c0 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
304d0 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
304e0 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
304f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
30500 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
30510 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
30520 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
30530 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
30540 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
30550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
30560 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
30570 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
30580 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
30590 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
305a0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
305b0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
305c0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
305d0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
305e0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
305f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
30600 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
30610 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
30620 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
30630 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
30640 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
30650 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
30660 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
30670 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
30680 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
30690 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
306a0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
306b0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
306c0 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
306d0 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
306e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
306f0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
30700 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
30710 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
30720 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
30730 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
30740 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
30750 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
30760 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
30770 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
30780 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30790 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
307a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
307b0 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
307c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
307d0 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
307e0 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
307f0 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
30800 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
30810 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
30820 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
30830 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
30840 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
30850 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
30860 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30870 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30880 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
30890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
308a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
308b0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
308c0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
308d0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
308e0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
308f0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
30900 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
30910 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
30920 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
30930 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
30940 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
30950 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
30960 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
30970 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
30980 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
30990 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
309a0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
309b0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
309c0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
309d0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
309e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
309f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
30a00 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
30a10 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
30a20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
30a30 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
30a40 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
30a50 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65  e->nCell--;.  me
30a60 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
30a70 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
30a80 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75 74  l - idx));.  put
30a90 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
30aa0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
30ab0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
30ac0 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
30ad0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
30ae0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
30af0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
30b00 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
30b10 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
30b20 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
30b30 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
30b40 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
30b50 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
30b60 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
30b70 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
30b80 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
30b90 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
30ba0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
30bb0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
30bc0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
30bd0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
30be0 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
30bf0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
30c00 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
30c10 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
30c20 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
30c30 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
30c40 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
30c50 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
30c60 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
30c70 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
30c80 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
30c90 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
30ca0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
30cb0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
30cc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
30cd0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
30ce0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
30cf0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
30d00 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
30d10 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
30d20 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
30d30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
30d40 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
30d50 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30d60 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
30d70 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
30d80 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
30d90 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
30da0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
30db0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
30dc0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
30dd0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
30de0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
30df0 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
30e00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
30e10 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
30e20 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
30e30 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
30e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
30e50 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
30e60 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
30e70 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
30e80 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
30e90 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
30ea0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
30eb0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
30ec0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
30ed0 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
30ee0 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
30ef0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
30f00 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
30f10 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
30f20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
30f30 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
30f40 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
30f50 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
30f60 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
30f70 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
30f80 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
30f90 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
30fa0 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
30fb0 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
30fc0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
30fd0 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
30fe0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
30ff0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
31000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
31010 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
31020 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
31030 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
31040 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
31050 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
31060 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
31070 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
31080 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
31090 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
310a0 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
310b0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
310c0 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
310d0 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
310e0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
310f0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
31100 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
31110 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
31120 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
31130 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
31140 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
31150 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
31160 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
31170 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
31180 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
31190 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
311a0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
311b0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
311c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
311d0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
311e0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
311f0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
31200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31210 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
31220 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
31230 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
31240 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
31250 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
31260 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
31270 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
31280 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31290 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
312a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
312b0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
312c0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
312d0 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
312e0 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
312f0 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
31300 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
31310 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
31320 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
31330 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
31340 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
31350 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
31360 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
31370 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
31380 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
31390 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
313a0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
313b0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
313c0 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
313d0 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
313e0 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
313f0 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
31400 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
31410 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
31420 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
31430 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
31440 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
31450 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
31460 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
31470 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
31480 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
31490 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
314a0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
314b0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
314c0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
314d0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
314e0 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
314f0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
31500 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
31510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
31520 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
31530 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
31540 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
31550 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
31560 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
31570 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
31580 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
31590 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
315a0 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
315b0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
315c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
315d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
315e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
315f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
31600 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31610 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
31620 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
31630 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
31640 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31650 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
31660 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
31670 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
31680 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
31690 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
316a0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
316b0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
316c0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
316d0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
316e0 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
316f0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
31700 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
31710 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
31720 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
31730 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
31740 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
31750 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
31760 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
31770 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
31780 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
31790 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
317a0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
317b0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
317c0 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
317d0 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
317e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
317f0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
31800 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
31810 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
31820 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
31830 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
31840 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
31850 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
31860 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
31870 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
31880 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
31890 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f  .    }.    memmo
318a0 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c  ve(&data[ins+2],
318b0 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64   &data[ins], end
318c0 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62  -ins);.    put2b
318d0 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
318e0 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
318f0 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
31900 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
31910 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
31920 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31930 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31940 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
31950 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
31960 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
31970 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
31980 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
31990 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
319a0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
319b0 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
319c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
319d0 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
319e0 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
319f0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
31a00 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
31a10 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
31a20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
31a30 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
31a40 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
31a50 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
31a60 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
31a70 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
31a80 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
31a90 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
31aa0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
31ab0 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
31ac0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
31ad0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
31ae0 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
31af0 6d 62 6c 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbled */.  int n
31b00 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
31b10 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
31b20 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
31b30 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
31b40 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
31b50 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
31b60 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75  ll bodies */.  u
31b70 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  16 *aSize       
31b80 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
31b90 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
31ba0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
31bb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
31bc0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
31bd0 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  tr;     /* Addre
31be0 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
31bf0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
31c00 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
31c10 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
31c20 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
31c30 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
31c40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c60 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
31c70 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63  for pPage */.  c
31c80 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
31c90 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
31ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
31cb0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
31cc0 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  n pPage */.  con
31cd0 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d  st int nUsable =
31ce0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
31cf0 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
31d00 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20  le size of page 
31d10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
31d20 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
31d30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
31d40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
31d50 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
31d60 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
31d70 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43  ( nCell>=0 && nC
31d80 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c  ell<=(int)MX_CEL
31d90 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20  L(pPage->pBt).  
31da0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 6e            && (in
31db0 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
31dc0 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20  >pBt)<=10921);. 
31dd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31de0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31df0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31e00 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
31e10 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
31e20 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
31e30 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
31e40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
31e50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
31e60 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
31e70 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
31e80 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
31e90 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
31ea0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
31eb0 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  Idx[nCell*2];.  
31ec0 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62  cellbody = nUsab
31ed0 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c  le;.  for(i=nCel
31ee0 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  l-1; i>=0; i--){
31ef0 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53  .    u16 sz = aS
31f00 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c  ize[i];.    pCel
31f10 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63  lptr -= 2;.    c
31f20 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20  ellbody -= sz;. 
31f30 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
31f40 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  lptr, cellbody);
31f50 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
31f60 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
31f70 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d  ell[i], sz);.  }
31f80 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
31f90 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
31fa0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
31fb0 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
31fc0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
31fd0 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
31fe0 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
31ff0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
32000 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
32010 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
32020 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
32030 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
32040 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
32050 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
32060 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
32070 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
32080 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
32090 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
320a0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
320b0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
320c0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
320d0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
320e0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
320f0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
32100 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
32110 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
32120 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
32130 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
32140 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
32150 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
32160 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
32170 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
32180 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
32190 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
321a0 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
321b0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
321c0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
321d0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
321e0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
321f0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
32200 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
32210 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
32220 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
32230 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
32240 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
32250 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
32260 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
32270 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
32280 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
32290 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
322a0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
322b0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
322c0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
322d0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
322e0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
322f0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
32300 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
32310 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32320 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
32330 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
32340 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
32350 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
32360 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
32370 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
32380 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
32390 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
323a0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
323b0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
323c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
323d0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
323e0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
323f0 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
32400 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
32410 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
32420 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63  trying to balanc
32430 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
32440 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
32450 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
32460 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
32470 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
32480 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
32490 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
324a0 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
324b0 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
324c0 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
324d0 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
324e0 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
324f0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
32500 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
32510 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
32520 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
32530 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
32540 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
32550 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
32560 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
32570 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
32580 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
32590 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
325a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
325b0 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
325c0 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
325d0 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
325e0 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
325f0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
32600 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
32610 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
32620 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
32630 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
32640 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
32650 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
32660 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
32670 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
32680 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
32690 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
326a0 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
326b0 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
326c0 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
326d0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
326e0 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
326f0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
32700 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
32710 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
32720 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
32730 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
32740 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
32750 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
32760 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
32770 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
32780 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
32790 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
327a0 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
327b0 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
327c0 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
327d0 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
327e0 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
327f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20  emPage *pNew;   
32800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32810 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
32820 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
32830 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
32840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32850 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32860 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
32870 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32890 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
328a0 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
328b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
328c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
328d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
328e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
328f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32900 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
32910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32920 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
32930 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  1 );..  /* This 
32940 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  error condition 
32950 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
32960 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
32970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
32980 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
32990 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
329a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
329b0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
329c0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
329d0 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
329e0 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
329f0 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
32a00 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
32a10 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
32a20 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
32a30 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
32a40 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
32a50 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
32a60 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
32a70 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
32a80 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
32a90 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
32aa0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
32ab0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
32ac0 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
32ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
32ae0 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
32af0 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
32b00 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
32b10 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20  ->apOvfl[0];.   
32b20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65   u16 szCell = ce
32b30 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
32b40 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20   pCell);.    u8 
32b50 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73  *pStop;..    ass
32b60 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32b70 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
32b80 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
32b90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32ba0 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46  ->aData[0]==(PTF
32bb0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
32bc0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29  DATA|PTF_LEAF) )
32bd0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
32be0 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  New, PTF_INTKEY|
32bf0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
32c00 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65  _LEAF);.    asse
32c10 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
32c20 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
32c30 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
32c40 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
32c50 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
32c60 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
32c70 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
32c80 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
32c90 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
32ca0 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
32cb0 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
32cc0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
32cd0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
32ce0 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
32cf0 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
32d00 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
32d10 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
32d20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
32d30 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
32d40 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
32d50 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
32d60 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
32d70 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
32d80 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
32d90 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
32da0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
32db0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
32dc0 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
32dd0 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
32de0 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
32df0 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
32e00 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
32e10 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
32e20 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
32e30 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
32e40 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
32e50 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
32e60 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
32e70 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
32e80 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
32e90 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
32ea0 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
32eb0 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
32ec0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
32ed0 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43  OvflPtr(pNew, pC
32ee0 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ell, &rc);.     
32ef0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
32f00 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69  /* Create a divi
32f10 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  der cell to inse
32f20 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  rt into pParent.
32f30 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   The divider cel
32f40 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74  l.    ** consist
32f50 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61  s of a 4-byte pa
32f60 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70  ge number (the p
32f70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50  age number of pP
32f80 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20  age) and.    ** 
32f90 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
32fa0 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69  h key value (whi
32fb0 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ch must be the s
32fc0 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ame value as the
32fd0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  .    ** largest 
32fe0 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20  key on pPage).. 
32ff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20     **.    ** To 
33000 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
33010 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50   key value on pP
33020 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20  age, first find 
33030 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a  the right-most .
33040 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
33050 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20  Page. The first 
33060 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
33070 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20  is cell are the 
33080 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c  .    ** record-l
33090 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c  ength (a variabl
330a0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
330b0 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73   at most 32-bits
330c0 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a   in size).    **
330d0 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c   and the key val
330e0 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  ue (a variable l
330f0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d  ength integer, m
33100 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75  ay have any valu
33110 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  e)..    ** The f
33120 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c  irst of the whil
33130 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c  e(...) loops bel
33140 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68  ow skips over th
33150 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a  e record-length.
33160 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68      ** field. Th
33170 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e  e second while(.
33180 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20  ..) loop copies 
33190 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72  the key value fr
331a0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65  om the.    ** ce
331b0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f  ll on pPage into
331c0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
331d0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
331e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
331f0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
33200 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f  ell-1);.    pSto
33210 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
33220 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65     while( (*(pCe
33230 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70  ll++)&0x80) && p
33240 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20  Cell<pStop );.  
33250 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
33260 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
33270 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28  ((*(pOut++) = *(
33280 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20  pCell++))&0x80) 
33290 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
332a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
332b0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
332c0 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65   cell into pPare
332d0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72  nt. */.    inser
332e0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
332f0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70  Parent->nCell, p
33300 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75  Space, (int)(pOu
33310 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20  t-pSpace),.     
33320 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61            0, pPa
33330 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ge->pgno, &rc);.
33340 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
33350 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
33360 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
33370 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
33380 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
33390 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
333a0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
333b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
333c0 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
333d0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
333e0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
333f0 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
33400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
33410 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
33420 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
33430 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
33440 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
33450 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
33460 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
33470 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
33480 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
33490 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
334a0 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
334b0 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
334c0 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
334d0 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
334e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
334f0 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
33500 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
33510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33520 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
33530 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
33540 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
33550 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
33560 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
33570 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
33580 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
33590 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
335a0 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
335b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
335c0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
335d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
335e0 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
335f0 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
33600 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
33610 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
33620 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
33630 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
33640 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
33650 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
33660 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
33670 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
33680 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
33690 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
336a0 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
336b0 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
336c0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
336d0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
336e0 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
336f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33700 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
33710 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
33720 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
33730 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
33740 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
33750 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
33760 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
33770 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
33780 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
33790 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
337a0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
337b0 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
337c0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
337d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
337e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
337f0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
33800 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
33810 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
33820 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
33830 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
33840 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
33850 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
33860 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
33870 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
33880 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
33890 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
338a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
338b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
338c0 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
338d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
338e0 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
338f0 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
33900 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
33910 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
33920 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
33930 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
33940 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33950 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
33960 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
33970 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
33980 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
33990 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
339a0 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
339b0 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
339c0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
339d0 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
339e0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
339f0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
33a00 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
33a10 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
33a20 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
33a30 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
33a40 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
33a50 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
33a60 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
33a70 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
33a80 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
33a90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
33aa0 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c  * MemPage.apOvfl
33ab0 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
33ac0 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
33ad0 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
33ae0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
33af0 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
33b00 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
33b10 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
33b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
33b30 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
33b40 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
33b50 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
33b60 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
33b70 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
33b80 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
33b90 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
33ba0 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
33bb0 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
33bc0 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
33bd0 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
33be0 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
33bf0 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64  tic void copyNod
33c00 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
33c10 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
33c20 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29   *pTo, int *pRC)
33c30 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
33c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33c50 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
33c60 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
33c70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  Bt;.    u8 * con
33c80 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
33c90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
33ca0 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
33cb0 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e  o->aData;.    in
33cc0 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
33cd0 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
33ce0 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  set;.    int con
33cf0 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
33d00 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
33d10 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  0 : 0);.    int 
33d20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74  rc;.    int iDat
33d30 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
33d40 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
33d50 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
33d60 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
33d70 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
33d80 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
33d90 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
33da0 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ]) <= (int)pBt->
33db0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
33dc0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
33dd0 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
33de0 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
33df0 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
33e00 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
33e10 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
33e20 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
33e30 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
33e40 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
33e50 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
33e60 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
33e70 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
33e80 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
33e90 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
33ea0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
33eb0 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
33ec0 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
33ed0 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
33ee0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
33ef0 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
33f00 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
33f10 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
33f20 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
33f30 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
33f40 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
33f50 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
33f60 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
33f70 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
33f80 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
33f90 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
33fa0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
33fb0 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
33fc0 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
33fd0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
33fe0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
33ff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34010 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
34020 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
34030 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
34040 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
34050 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
34060 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
34070 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
34080 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
34090 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
340a0 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
340b0 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
340c0 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
340d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
340e0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
340f0 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
34100 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
34110 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
34120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
34130 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
34140 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
34150 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
34160 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
34170 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
34180 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
34190 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
341a0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
341b0 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
341c0 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
341d0 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
341e0 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
341f0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
34200 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
34210 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
34220 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
34230 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
34240 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
34250 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
34260 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
34270 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
34280 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
34290 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
342a0 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
342b0 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
342c0 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
342d0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
342e0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
342f0 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
34300 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
34310 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
34320 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
34330 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
34340 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
34350 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
34360 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
34370 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
34380 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
34390 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
343a0 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
343b0 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
343c0 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
343d0 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
343e0 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
343f0 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
34400 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34410 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
34420 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
34430 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
34440 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
34450 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
34460 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
34470 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
34480 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
34490 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
344a0 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
344b0 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
344c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
344d0 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
344e0 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
344f0 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
34500 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
34510 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
34520 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
34530 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
34540 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
34550 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
34560 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
34570 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
34580 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
34590 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
345a0 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
345b0 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
345c0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
345d0 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
345e0 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
345f0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
34600 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
34610 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
34620 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
34630 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
34640 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
34650 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
34660 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
34670 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
34680 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
34690 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
346a0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
346b0 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
346c0 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
346d0 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
346e0 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
346f0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
34700 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
34710 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
34720 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
34730 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
34740 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
34750 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
34760 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
34770 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e  o hold one page.
34780 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74   If while insert
34790 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  ing cells into t
347a0 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67  he parent.** pag
347b0 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20  e (pParent) the 
347c0 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
347d0 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
347e0 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  is buffer is.** 
347f0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
34800 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66  e parent's overf
34810 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75  low cells. Becau
34820 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
34830 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61   inserts.** a ma
34840 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69  ximum of four di
34850 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
34860 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
34870 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
34880 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63  m.** size of a c
34890 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69  ell stored withi
348a0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
348b0 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73  de is always les
348c0 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66  s than 1/4.** of
348d0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
348e0 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
348f0 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61   buffer is guara
34900 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
34910 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20  e.** enough for 
34920 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  all overflow cel
34930 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76  ls..**.** If aOv
34940 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74  flSpace is set t
34950 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  o a null pointer
34960 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
34970 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
34980 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66  TE_NOMEM..*/.#if
34990 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45   defined(_MSC_VE
349a0 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e  R) && _MSC_VER >
349b0 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e 65  = 1700 && define
349c0 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d  d(_M_ARM).#pragm
349d0 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f  a optimize("", o
349e0 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ff).#endif.stati
349f0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
34a00 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
34a10 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
34a20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
34a30 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
34a40 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
34a50 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
34a60 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
34a70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
34a80 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
34a90 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
34aa0 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
34ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34ac0 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
34ad0 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
34ae0 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
34af0 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20  int isRoot,     
34b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b10 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
34b20 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
34b30 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b  e */.  int bBulk
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
34b60 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70  f this call is p
34b70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f  art of a bulk lo
34b80 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ad */.){.  BtSha
34b90 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
34ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
34bb0 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
34bc0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
34bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
34bf0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
34c00 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
34c10 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
34c20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
34c30 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
34c40 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
34c50 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20    int nNew = 0; 
34c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34c70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
34c80 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
34c90 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
34ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34cb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
34cc0 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
34cd0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34cf0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
34d00 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
34d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
34d30 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
34d40 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
34d50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34d60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
34d70 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
34d80 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72  */.  u16 leafCor
34d90 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
34da0 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
34db0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
34dc0 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
34dd0 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
34de0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
34df0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
34e00 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
34e10 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
34e20 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
34e30 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
34e40 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
34e50 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
34e60 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34e80 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
34e90 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
34ea0 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
34eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
34ec0 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
34ed0 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
34ee0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
34ef0 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
34f00 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
34f10 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
34f20 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
34f30 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30  t iOvflSpace = 0
34f40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
34f50 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
34f60 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  of aOvflSpace[] 
34f70 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74  */.  int szScrat
34f80 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
34f90 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72    /* Size of scr
34fa0 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75  atch memory requ
34fb0 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  ested */.  MemPa
34fc0 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20  ge *apOld[NB];  
34fd0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
34fe0 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73   and up to two s
34ff0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d  iblings */.  Mem
35000 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
35010 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
35020 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
35030 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
35040 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
35050 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
35060 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
35070 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
35080 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
35090 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20  .  u8 *pRight;  
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350b0 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70  /* Location in p
350c0 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73  arent of right-s
350d0 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a  ibling pointer *
350e0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
350f0 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  -1];            
35100 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
35110 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
35120 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
35130 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
35140 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
35150 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
35160 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
35170 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
35180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35190 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
351a0 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
351b0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
351c0 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
351d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
351e0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
351f0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
35200 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
35210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
35220 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
35230 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
35240 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
35250 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
35260 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
35270 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
35280 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67  rs cells */.  Pg
35290 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
352a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
352b0 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20  mp var to store 
352c0 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  a page number in
352d0 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
352e0 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73  rent->pBt;.  ass
352f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
35300 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
35310 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
35320 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
35330 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
35340 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23  ->pDbPage) );..#
35350 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42  if 0.  TRACE(("B
35360 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
35370 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
35380 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
35390 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
353a0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ));.#endif..  /*
353b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
353c0 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20  Parent may have 
353d0 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72  at most one over
353e0 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69  flow cell. And i
353f0 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72  f.  ** this over
35400 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65  flow cell is pre
35410 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sent, it must be
35420 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a   the cell with .
35430 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65    ** index iPare
35440 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e  ntIdx. This scen
35450 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74  ario comes about
35460 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35470 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ion.  ** is call
35480 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20  ed (indirectly) 
35490 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
354a0 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a  eDelete()..  */.
354b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
354c0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
354d0 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  || pParent->nOve
354e0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73  rflow==1 );.  as
354f0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
35500 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
35510 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30  Parent->aiOvfl[0
35520 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b  ]==iParentIdx );
35530 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70  ..  if( !aOvflSp
35540 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ace ){.    retur
35550 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
35560 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
35570 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
35580 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73   to balance. Als
35590 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c  o locate the cel
355a0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20  ls in pParent . 
355b0 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20   ** that divide 
355c0 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e  the siblings. An
355d0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
355e0 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
355f0 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69  ings on .  ** ei
35600 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
35610 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  ge. More sibling
35620 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
35630 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
35640 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  er, .  ** if the
35650 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61  re are fewer tha
35660 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  n NN siblings on
35670 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e   the other side.
35680 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a   If pParent.  **
35690 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72   has NB or fewer
356a0 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61   children then a
356b0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
356c0 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e  Parent are taken
356d0 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
356e0 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f  is loop also dro
356f0 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63  ps the divider c
35700 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ells from the pa
35710 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a  rent page. This.
35720 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65    ** way, the re
35730 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66  mainder of the f
35740 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
35750 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69   have to deal wi
35760 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72  th any.  ** over
35770 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68  flow cells in th
35780 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73  e parent page, s
35790 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73  ince if any exis
357a0 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20  ted they will.  
357b0 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ** have already 
357c0 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20  been removed..  
357d0 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74  */.  i = pParent
357e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50  ->nOverflow + pP
357f0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  arent->nCell;.  
35800 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e  if( i<2 ){.    n
35810 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  xDiv = 0;.  }els
35820 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  e{.    assert( b
35830 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b  Bulk==0 || bBulk
35840 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ==1 );.    if( i
35850 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20  ParentIdx==0 ){ 
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35870 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30  .      nxDiv = 0
35880 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
35890 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b  iParentIdx==i ){
358a0 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69  .      nxDiv = i
358b0 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65  -2+bBulk;.    }e
358c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
358d0 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20  t( bBulk==0 );. 
358e0 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61       nxDiv = iPa
358f0 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d  rentIdx-1;.    }
35900 0a 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b  .    i = 2-bBulk
35910 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69  ;.  }.  nOld = i
35920 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44  +1;.  if( (i+nxD
35930 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
35940 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d  rflow)==pParent-
35950 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52  >nCell ){.    pR
35960 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d  ight = &pParent-
35970 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
35980 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20  hdrOffset+8];.  
35990 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68  }else{.    pRigh
359a0 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  t = findCell(pPa
359b0 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
359c0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
359d0 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20  );.  }.  pgno = 
359e0 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29  get4byte(pRight)
359f0 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
35a00 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
35a10 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
35a20 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29  o, &apOld[i], 0)
35a30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
35a40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
35a50 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
35a60 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
35a70 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
35a80 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
35a90 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
35aa0 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
35ab0 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
35ac0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
35ad0 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
35ae0 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
35af0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
35b00 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72  iOvfl[0] && pPar
35b10 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
35b20 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
35b30 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76   = pParent->apOv
35b40 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e  fl[0];.      pgn
35b50 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
35b60 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
35b70 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
35b80 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
35b90 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  Div[i]);.      p
35ba0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
35bb0 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  w = 0;.    }else
35bc0 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
35bd0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
35be0 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
35bf0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
35c00 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
35c10 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
35c20 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
35c30 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
35c40 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
35c50 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72  ]);..      /* Dr
35c60 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  op the cell from
35c70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35c80 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c  . apDiv[i] still
35c90 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20   points to.     
35ca0 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74   ** the cell wit
35cb0 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20  hin the parent, 
35cc0 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68  even though it h
35cd0 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e  as been dropped.
35ce0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
35cf0 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64  s safe because d
35d00 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f  ropping a cell o
35d10 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74  nly overwrites t
35d20 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
35d30 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
35d40 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  it, and this fun
35d50 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ction does not n
35d60 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  eed the first.  
35d70 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
35d80 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
35d90 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f   cell. So the po
35da0 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f  inter is safe to
35db0 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61   use.      ** la
35dc0 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20  ter on.  .      
35dd0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  **.      ** But 
35de0 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69 6e  not if we are in
35df0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
35e00 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64  ode. In secure-d
35e10 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20  elete mode,.    
35e20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c    ** the dropCel
35e30 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  l() routine will
35e40 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65   overwrite the e
35e50 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20  ntire cell with 
35e60 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a  zeroes..      **
35e70 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
35e80 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20  emporarily copy 
35e90 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  the cell into th
35ea0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20  e aOvflSpace[]. 
35eb0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20       ** buffer. 
35ec0 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65  It will be copie
35ed0 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73  d out again as s
35ee0 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63  oon as the aSpac
35ef0 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20  e[] buffer.     
35f00 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   ** is allocated
35f10 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
35f20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
35f30 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
35f40 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  E ){.        int
35f50 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20   iOff;..        
35f60 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54  iOff = SQLITE_PT
35f70 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69  R_TO_INT(apDiv[i
35f80 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ]) - SQLITE_PTR_
35f90 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e  TO_INT(pParent->
35fa0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  aData);.        
35fb0 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b  if( (iOff+szNew[
35fc0 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73  i])>(int)pBt->us
35fd0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
35fe0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35ff0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36000 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
36010 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
36020 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
36030 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  ));.          go
36040 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
36050 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  up;.        }els
36060 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
36070 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b  cpy(&aOvflSpace[
36080 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c  iOff], apDiv[i],
36090 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20   szNew[i]);.    
360a0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
360b0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44   &aOvflSpace[apD
360c0 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
360d0 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d  Data];.        }
360e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
360f0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
36100 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
36110 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
36120 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ew[i], &rc);.   
36130 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
36140 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
36150 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
36160 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
36170 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
36180 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
36190 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
361a0 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
361b0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
361c0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
361d0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
361e0 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
361f0 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
36200 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
36210 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
36220 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
36230 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
36240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36250 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
36260 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
36270 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
36280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36290 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
362a0 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
362b0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
362c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362d0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
362e0 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
362f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36310 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
36320 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
36330 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
36340 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
36350 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
36360 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
36370 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
36380 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
36390 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
363a0 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
363b0 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
363c0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
363d0 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
363e0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
363f0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
36400 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
36410 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
36420 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
36430 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
36440 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
36450 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
36460 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
36470 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
36480 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
36490 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
364a0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
364b0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
364c0 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
364d0 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
364e0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
364f0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
36500 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
36510 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
36520 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
36530 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
36540 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
36550 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
36560 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
36570 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
36580 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
36590 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
365a0 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
365b0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
365c0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
365d0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
365e0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
365f0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
36600 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
36610 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
36620 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
36630 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
36640 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
36650 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36660 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
36670 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
36680 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
36690 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
366a0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
366b0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
366c0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
366d0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
366e0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
366f0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
36700 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
36710 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
36720 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
36730 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
36740 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
36750 3e 69 6e 74 4b 65 79 4c 65 61 66 3b 0a 20 20 66  >intKeyLeaf;.  f
36760 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
36770 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
36780 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
36790 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
367a0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
367b0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
367c0 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
367d0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
367e0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
367f0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
36800 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
36810 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
36820 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
36830 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
36840 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
36850 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
36860 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
36870 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
36880 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
36890 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
368a0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
368b0 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
368c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
368d0 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
368e0 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
368f0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
36900 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
36910 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
36920 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
36930 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
36940 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
36950 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
36960 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
36970 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
36980 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
36990 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
369a0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
369b0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
369c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
369d0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
369e0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
369f0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
36a00 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
36a10 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
36a20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
36a30 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
36a40 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
36a50 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
36a60 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
36a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
36a80 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
36a90 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
36aa0 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
36ab0 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
36ac0 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
36ad0 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
36ae0 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
36af0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
36b00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
36b10 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
36b20 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
36b30 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
36b40 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
36b50 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
36b60 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
36b70 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
36b80 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
36b90 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
36ba0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
36bb0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
36bc0 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
36bd0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
36be0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
36bf0 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
36c00 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
36c10 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
36c20 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
36c30 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
36c40 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
36c50 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
36c60 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
36c70 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
36c80 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
36c90 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
36ca0 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
36cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
36cc0 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
36cd0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
36ce0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
36cf0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
36d00 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
36d10 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
36d20 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
36d30 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
36d40 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
36d50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
36d60 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
36d70 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
36d80 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
36d90 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
36da0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
36db0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
36dc0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
36dd0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
36de0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
36df0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
36e00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
36e10 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
36e20 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
36e30 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
36e40 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
36e50 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
36e60 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
36e70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
36e80 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
36e90 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
36ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36eb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
36ec0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
36ed0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
36ee0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
36ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
36f00 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
36f10 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
36f20 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
36f30 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
36f40 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
36f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36f60 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
36f70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
36f80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
36f90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
36fa0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
36fb0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
36fc0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
36fd0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
36fe0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
36ff0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
37000 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
37010 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
37020 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
37030 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
37040 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
37050 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
37060 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
37070 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
37080 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
37090 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
370a0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
370b0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
370c0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
370d0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
370e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
370f0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
37100 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
37110 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
37120 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
37130 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
37140 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
37150 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
37160 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
37170 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
37180 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
37190 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
371a0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
371b0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
371c0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
371d0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
371e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
371f0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
37200 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
37210 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
37220 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
37230 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
37240 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
37250 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
37260 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
37270 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
37280 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
37290 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
372a0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
372b0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
372c0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
372d0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
372e0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
372f0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
37300 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
37310 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
37320 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
37330 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
37340 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
37350 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
37360 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
37370 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
37380 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
37390 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
373a0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
373b0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
373c0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
373d0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
373e0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
373f0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
37400 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
37410 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
37420 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
37430 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
37440 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
37450 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
37460 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
37470 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
37480 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
37490 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
374a0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
374b0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
374c0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
374d0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
374e0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
374f0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
37500 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
37510 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
37520 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
37530 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
37540 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
37550 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
37560 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
37570 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
37580 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
37590 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
375a0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
375b0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
375c0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
375d0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
375e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
375f0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
37600 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
37610 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
37620 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
37630 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
37640 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
37650 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
37660 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
37670 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
37680 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
37690 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
376a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
376b0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
376c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
376d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
376e0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
376f0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
37700 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
37710 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
37720 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
37730 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
37740 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
37750 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
37760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
37770 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
37780 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
37790 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
377a0 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
377b0 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
377c0 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
377d0 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
377e0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
377f0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
37800 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
37810 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
37820 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
37830 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
37840 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
37850 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
37860 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
37870 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
37880 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
37890 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
378a0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
378b0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
378c0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
378d0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
378e0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
378f0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
37900 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
37910 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
37920 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
37930 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
37940 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
37950 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
37960 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
37970 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
37980 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
37990 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
379a0 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
379b0 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
379c0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
379d0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
379e0 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
379f0 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
37a00 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
37a10 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
37a20 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
37a30 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
37a40 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
37a50 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
37a60 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
37a70 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
37a80 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
37a90 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
37aa0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
37ab0 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
37ac0 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
37ad0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
37ae0 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
37af0 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
37b00 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
37b10 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
37b20 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
37b30 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
37b40 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
37b50 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
37b60 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
37b70 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
37b80 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37b90 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
37ba0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
37bb0 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
37bc0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
37bd0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
37be0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
37bf0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
37c00 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
37c10 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
37c20 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
37c30 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
37c40 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
37c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
37c60 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
37c70 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
37c80 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
37c90 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
37ca0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
37cb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
37cc0 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
37cd0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
37ce0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
37cf0 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
37d00 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
37d10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
37d20 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
37d30 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
37d40 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
37d50 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
37d60 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
37d70 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
37d80 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
37d90 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
37da0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
37db0 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
37dc0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
37dd0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
37de0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
37df0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
37e00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37e20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
37e30 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
37e40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
37e50 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
37e60 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
37e70 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
37e80 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
37e90 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
37ea0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
37eb0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
37ec0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
37ed0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
37ee0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
37ef0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
37f00 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
37f10 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
37f20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
37f30 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
37f40 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
37f50 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
37f60 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
37f70 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
37f80 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
37f90 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
37fa0 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
37fb0 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
37fc0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
37fd0 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
37fe0 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
37ff0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
38000 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
38010 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
38020 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
38030 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
38040 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
38050 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
38060 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
38070 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
38080 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
38090 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
380a0 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
380b0 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
380c0 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
380d0 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
380e0 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
380f0 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
38100 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
38110 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
38120 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
38130 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
38140 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
38150 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
38160 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
38170 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
38180 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
38190 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
381a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
381b0 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
381c0 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
381d0 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
381e0 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
381f0 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
38200 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
38210 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
38220 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
38230 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
38240 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
38250 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
38260 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
38270 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
38280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
38290 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
382a0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
382b0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
382c0 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
382d0 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
382e0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
382f0 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
38300 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
38310 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
38320 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
38330 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
38340 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
38350 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
38360 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
38370 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
38380 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
38390 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
383a0 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
383b0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
383c0 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
383d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
383e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
383f0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
38400 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
38410 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
38420 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
38430 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
38440 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
38450 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
38460 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
38470 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
38480 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells