/ Hex Artifact Content
Login

Artifact b1ba9f65eba193ecae9519be29cce63bc1daef4c:


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 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
52d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
52e0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
52f0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
5300: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5310: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5320: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
5330: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
5340: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5350: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5360: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5370: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5380: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5390: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
53a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
53b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
53c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
53d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
53e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
53f0: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
5400: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
5410: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5420: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5430: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5440: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5450: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5460: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5470: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5480: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5490: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
54a0: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54c0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54f0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5500: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5510: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5520: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5530: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5540: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5550: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5560: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5570: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5580: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5590: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
55a0: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55b0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55c0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55d0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55e0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55f0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5600: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5610: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5620: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5630: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5640: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5650: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5660: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5670: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5680: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5690: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
56a0: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56b0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
56d0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
56e0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
56f0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5700: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5710: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5720: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5730: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5740: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5750: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5760: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5770: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5780: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5790: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
57a0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
57b0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
57c0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
57d0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
57e0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
57f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5800: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5810: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5820: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5830: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5840: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5850: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5860: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5870: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5880: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5890: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
58a0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
58b0: 70 20 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f  p ? saveCursorsO
58c0: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
58d0: 70 45 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54  pExcept) : SQLIT
58e0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
58f0: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
5900: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
5910: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
5920: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
5930: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
5940: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
5950: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
5960: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
5970: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
5980: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
5990: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
59a0: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
59b0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
59c0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
59d0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
59e0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
59f0: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
5a00: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
5a10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5a20: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5a30: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5a40: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
5a50: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
5a60: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
5a70: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
5a80: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
5a90: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
5aa0: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
5ab0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
5ac0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
5ad0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
5ae0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
5af0: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
5b00: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
5b10: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
5b20: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
5b30: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
5b40: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
5b50: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
5b60: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b70: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5b80: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5b90: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
5ba0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bb0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
5bc0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5be0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5bf0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5c00: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5c10: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5c20: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5c30: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5c40: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5c50: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5c60: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5c70: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5c80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5c90: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ca0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5cb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5cc0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5cd0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5ce0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5cf0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d00: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5d10: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5d20: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5d30: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5d40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5d50: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5d60: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5d70: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5d80: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5d90: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5da0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5db0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5dc0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5dd0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5de0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5df0: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5e00: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5e10: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5e20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5e30: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5e40: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5e50: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5e60: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5e70: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5e80: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5e90: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5ea0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5eb0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5ec0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ed0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5ee0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5ef0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5f00: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5f10: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5f20: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5f30: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5f40: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5f60: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5f70: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5f80: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5fa0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5fb0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5fc0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5fd0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5fe0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5ff0: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
6000: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
6010: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
6020: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6030: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6040: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6050: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6060: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6070: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6080: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
6090: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
60a0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
60b0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
60c0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
60d0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
60e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
60f0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6100: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6110: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
6120: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6130: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6140: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6150: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6160: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6180: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6190: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
61a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
61b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
61c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
61d0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
61e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
61f0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6200: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6210: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6220: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6230: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6250: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6260: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6270: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6280: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6290: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
62a0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
62b0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
62c0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
62d0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
62e0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
62f0: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6300: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6310: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6320: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6330: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6340: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6350: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6360: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6370: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6380: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6390: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
63a0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
63b0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
63c0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
63d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
63e0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
63f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
6400: 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61  nt skipNext;.  a
6410: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6420: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6440: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6450: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6460: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6470: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6480: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6490: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
64a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
64b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
64c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
64d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
64e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
64f0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
6500: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6510: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
6520: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6530: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
6540: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
6550: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6560: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6570: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
6580: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
6590: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
65a0: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
65b0: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
65c0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
65d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
65e0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
65f0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
6600: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
6610: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
6620: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
6630: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
6640: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
6650: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
6660: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6670: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
6680: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6690: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
66a0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
66b0: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
66c0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
66d0: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
66e0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
66f0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
6700: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
6710: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
6720: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
6730: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
6740: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
6750: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
6760: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
6770: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
6780: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
6790: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
67a0: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
67b0: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
67c0: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
67d0: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
67e0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
67f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
6800: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
6810: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
6820: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
6830: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
6840: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6850: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
6860: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
6870: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
6880: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
6890: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
68a0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
68b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
68c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
68d0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
68e0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
68f0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6900: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
6910: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6920: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
6930: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
6940: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
6950: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
6960: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
6970: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
6980: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
6990: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
69a0: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
69b0: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
69c0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
69d0: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
69e0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
69f0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
6a00: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
6a10: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
6a20: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
6a30: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
6a40: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
6a50: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
6a60: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
6a70: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
6a80: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
6a90: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
6aa0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
6ab0: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
6ac0: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
6ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ae0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
6af0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
6b00: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
6b10: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
6b20: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
6b30: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
6b40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
6b50: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
6b60: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
6b70: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
6b80: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
6b90: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
6ba0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
6bb0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
6bc0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
6bd0: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
6be0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
6bf0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
6c00: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
6c10: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
6c20: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
6c30: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
6c40: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
6c50: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
6c60: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
6c70: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
6c80: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
6c90: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6ca0: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
6cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6cc0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6cd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6ce0: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
6cf0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
6d00: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
6d10: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
6d20: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
6d30: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
6d40: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
6d50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
6d60: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
6d70: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
6d80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
6d90: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
6da0: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
6db0: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
6dc0: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
6dd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6de0: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
6df0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
6e00: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
6e10: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
6e20: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
6e30: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
6e40: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
6e50: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
6e60: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
6e70: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
6e80: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
6e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6ea0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6eb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
6ec0: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
6ed0: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
6ee0: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
6ef0: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
6f00: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
6f10: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
6f20: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
6f30: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
6f40: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
6f50: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
6f60: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
6f70: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
6f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
6f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6fa0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6fb0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6fc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6fd0: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6fe0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6ff0: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
7000: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
7010: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
7020: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
7030: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
7040: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
7050: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
7060: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
7070: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
7080: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7090: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
70a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
70b0: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
70c0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
70d0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
70e0: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
70f0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
7100: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7110: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7120: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
7130: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
7140: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
7150: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7160: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
7170: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
7180: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7190: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
71a0: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
71b0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
71c0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
71d0: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
71e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
71f0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7200: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
7210: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7220: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
7230: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
7240: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
7250: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7260: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7270: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7280: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
7290: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
72a0: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
72b0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
72c0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
72d0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
72e0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
72f0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
7300: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
7310: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
7320: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
7330: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
7340: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7350: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7360: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
7370: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7380: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7390: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
73a0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
73b0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
73c0: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
73d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
73e0: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
73f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
7400: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7410: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7420: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
7430: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
7440: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7450: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
7460: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
7470: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7480: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7490: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
74a0: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
74b0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
74c0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
74d0: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
74e0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
74f0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
7500: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
7510: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
7520: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
7530: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
7540: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
7550: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
7560: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
7570: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
7580: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
7590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
75a0: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
75b0: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
75c0: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
75d0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
75e0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
75f0: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
7600: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7610: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
7620: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
7630: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
7640: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7650: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7660: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
7670: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7680: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
7690: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
76a0: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
76b0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
76c0: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
76d0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
76e0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
76f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
7700: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7710: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7720: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7730: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
7740: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7750: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
7760: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
7770: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7780: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
7790: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
77a0: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
77b0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
77c0: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
77d0: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
77e0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
77f0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
7800: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
7810: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
7820: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
7830: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
7840: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7850: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7860: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7870: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
7880: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7890: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
78a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
78b0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
78c0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
78d0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
78e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
78f0: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
7900: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
7910: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
7920: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
7930: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7940: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
7950: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
7960: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7970: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7980: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
7990: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
79a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
79b0: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
79c0: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
79d0: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
79e0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
79f0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
7a00: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
7a10: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
7a20: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
7a30: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
7a40: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7a50: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
7a60: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
7a70: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
7a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7a90: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
7aa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ab0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
7ac0: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
7ad0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
7ae0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7af0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
7b00: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
7b10: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
7b20: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
7b30: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
7b40: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
7b50: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
7b60: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
7b70: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
7b80: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
7b90: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
7ba0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
7bb0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
7bc0: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
7bd0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7be0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7bf0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
7c00: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
7c10: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
7c20: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
7c30: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
7c40: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
7c50: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
7c60: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
7c70: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
7c80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7c90: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ca0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7cb0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7cc0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7cd0: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7ce0: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7cf0: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7d00: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7d10: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7d20: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7d30: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
7d40: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
7d50: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
7d60: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
7d70: 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65 6c 6c  byte(&(P)->aCell
7d80: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
7d90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
7da0: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
7db0: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
7dc0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
7dd0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7de0: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
7df0: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
7e00: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
7e10: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
7e20: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
7e30: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
7e40: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
7e50: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
7e60: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
7e70: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
7e80: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
7e90: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7ea0: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
7eb0: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
7ec0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7ed0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7ee0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7ef0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7f10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7f20: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7f30: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7f40: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7f50: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7f60: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
7f70: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
7f80: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
7f90: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
7fa0: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
7fb0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
7fc0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
7fd0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7fe0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7ff0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8000: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8010: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
8020: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
8030: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
8040: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
8050: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
8060: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
8070: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
8080: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
8090: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
80a0: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
80b0: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
80c0: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
80d0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
80e0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
80f0: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
8100: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
8110: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
8120: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
8130: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
8140: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
8150: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8160: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
8170: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8180: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8190: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
81a0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
81b0: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
81c0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
81d0: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
81e0: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
81f0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
8200: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
8210: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
8220: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
8230: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8240: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8250: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
8260: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8270: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
8280: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8290: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
82a0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
82b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
82c0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
82d0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
8300: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
8310: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
8320: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
8330: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
8340: 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50  (u16)(&pInfo->pP
8350: 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c  ayload[pInfo->nL
8360: 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a  ocal] - pCell);.
8370: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8380: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8390: 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w + 4;.}../*.** 
83a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
83b0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
83c0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
83d0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
83e0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
83f0: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8400: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8410: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8420: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8430: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8440: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8450: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8460: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8470: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8480: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8490: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
84a0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
84b0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
84c0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
84d0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
84e0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
84f0: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8500: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8510: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8520: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8530: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8540: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8550: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8560: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8570: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8580: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8590: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
85a0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
85b0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
85d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
85e0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
85f0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8600: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8610: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8620: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8630: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8640: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8650: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8660: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8670: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8680: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8690: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
86a0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
86b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61  ert( pPage->noPa
86c0: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
86d0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
86e0: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70  trSize==4 );.  p
86f0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
8700: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
8710: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
8720: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
8730: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
8740: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
8750: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
8760: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
8770: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
8780: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
8790: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
87a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
87b0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87c0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87d0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87e0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
87f0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8800: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8810: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8820: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8830: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8840: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8850: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8860: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
8880: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
8890: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
88a0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
88b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
88c0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
88d0: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
88e0: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
88f0: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
8900: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
8910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8920: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8930: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8940: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8950: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
8960: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
8970: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8980: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c 7c 20 70  >intKeyLeaf || p
8990: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
89a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89b0: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
89c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
89d0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
89e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
89f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8a00: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
8a10: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
8a20: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8a30: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8a40: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8a50: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8a60: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
8a70: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
8a80: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
8a90: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
8aa0: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
8ab0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
8ac0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
8ad0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
8ae0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8af0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
8b00: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
8b10: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8b20: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
8b30: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
8b40: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
8b50: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
8b60: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
8b70: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
8b80: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
8b90: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
8ba0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
8bb0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
8bc0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
8bd0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
8be0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
8bf0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
8c00: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
8c10: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
8c20: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
8c30: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
8c40: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
8c50: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
8c60: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
8c70: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
8c80: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
8c90: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
8ca0: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
8cb0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8cc0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
8cd0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
8ce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
8cf0: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
8d00: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
8d10: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
8d20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8d30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8d40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
8d50: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
8d60: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
8d70: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8d80: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8d90: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8da0: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8db0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8dc0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8dd0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
8de0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
8df0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
8e00: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
8e10: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8e20: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8e30: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8e40: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8e50: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8e60: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8e70: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8e80: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8e90: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8ea0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8eb0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8ec0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8ed0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
8ee0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
8ef0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
8f00: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8f10: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8f20: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8f30: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8f40: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
8f50: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
8f60: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
8f70: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
8f80: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
8f90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8fa0: 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65  Index(.  MemPage
8fb0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8fc0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8fd0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8fe0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9000: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9010: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9020: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9030: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9040: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9050: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9070: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9080: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9090: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
90a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
90b0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
90c0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a  ell payload */..
90d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
90e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
90f0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9100: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9110: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9120: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9130: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9140: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20  ->intKeyLeaf==0 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30  ge->noPayload==0
9170: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
9180: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
9190: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61  ldPtrSize;.  nPa
91a0: 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a  yload = *pIter;.
91b0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d    if( nPayload>=
91c0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
91d0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
91e0: 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26  ;.    nPayload &
91f0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
9200: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
9210: 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c   (nPayload<<7) |
9220: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
9230: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
9240: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
9250: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9260: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
9270: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
9280: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9290: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
92a0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
92b0: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
92c0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
92d0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
92e0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
92f0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9300: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9310: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
9320: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9330: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9340: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9350: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9360: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9370: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9380: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9390: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
93a0: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
93b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
93c0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
93d0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
93e0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
93f0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
9400: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
9410: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
9420: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9430: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
9440: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
9450: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
9460: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9470: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9480: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9490: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
94a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
94b0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
94c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
94d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
94e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
94f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
9500: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9510: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
9520: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
9530: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
9540: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9550: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9560: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9570: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
9580: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
9590: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
95a0: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
95b0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
95c0: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
95d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
95e0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
95f0: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
9600: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
9610: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
9620: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
9630: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
9640: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9650: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
9660: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
9670: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
9680: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
9690: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
96a0: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
96b0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
96c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
96d0: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
96e0: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
96f0: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
9700: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
9710: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
9720: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
9730: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
9740: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
9750: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
9760: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
9770: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
9780: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
9790: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
97a0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
97b0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
97c0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
97d0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
97e0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
97f0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
9800: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
9830: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
9840: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
9850: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
9880: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
9890: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
98a0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
98b0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
98c0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
98d0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
98e0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
98f0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
9900: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
9910: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
9920: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
9930: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
9940: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
9950: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
9960: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
9970: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
9980: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
9990: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
99a0: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
99b0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
99c0: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
99d0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
99e0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
99f0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
9a00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a10: 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a  noPayload==0 );.
9a20: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
9a30: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
9a40: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
9a50: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9a60: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
9a70: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
9a80: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
9a90: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9aa0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9ab0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
9ac0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
9ad0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
9ae0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
9af0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
9b00: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
9b10: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
9b20: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
9b30: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
9b40: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
9b50: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
9b60: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
9b70: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
9b80: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
9b90: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
9ba0: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
9bb0: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
9bc0: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
9bd0: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
9be0: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
9bf0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9c00: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
9c10: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9c20: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9c30: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9c40: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9c50: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
9c60: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9c70: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
9c80: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9c90: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
9ca0: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
9cb0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
9cc0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
9cd0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
9ce0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
9cf0: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
9d00: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
9d10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
9d40: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
9d50: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
9d60: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9d70: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
9d80: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
9d90: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
9da0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
9db0: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
9dc0: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
9dd0: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
9de0: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
9df0: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
9e00: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
9e10: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
9e20: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
9e30: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
9e40: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
9e50: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9e60: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9e70: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
9e80: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9e90: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9ea0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9ec0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
9ed0: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
9ee0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
9ef0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
9f00: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
9f10: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
9f20: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
9f30: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
9f40: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
9f50: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
9f60: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
9f70: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
9f80: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
9f90: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
9fa0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
9fb0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
9fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
9fd0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
9fe0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
9ff0: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a000: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a010: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a020: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a030: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a040: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
a050: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
a060: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
a070: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
a080: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
a090: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a0a0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
a0b0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
a0c0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
a0d0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
a0e0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a0f0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a100: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a120: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
a130: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
a140: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
a150: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
a160: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
a170: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
a180: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
a190: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a1a0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
a1b0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
a1c0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
a1d0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
a1e0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
a1f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a200: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
a210: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
a220: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
a230: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
a240: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
a250: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
a260: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
a270: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
a280: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
a290: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
a2a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a2b0: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
a2c0: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a2d0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
a2e0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
a2f0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
a300: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
a310: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
a320: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
a330: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a340: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
a350: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
a360: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
a370: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
a380: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
a390: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
a3a0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
a3b0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
a3c0: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
a3d0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
a3e0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
a3f0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
a400: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
a410: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
a420: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
a430: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
a440: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
a450: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
a460: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
a470: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
a480: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a490: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
a4a0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
a4b0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
a4c0: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a  ntent area..**.*
a4d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
a4e0: 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c  -44582-60138 SQL
a4f0: 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d  ite may from tim
a500: 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61  e to time reorga
a510: 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65  nize a.** b-tree
a520: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
a530: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62  ere are no freeb
a540: 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e  locks or fragmen
a550: 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20  t bytes, all.** 
a560: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65  unused bytes are
a570: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
a580: 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70  e unallocated sp
a590: 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20  ace region, and 
a5a0: 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65  all.** cells are
a5b0: 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20   packed tightly 
a5c0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a5d0: 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
a5e0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
a5f0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
a600: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
a630: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
a660: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
a670: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a690: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
a6a0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
a6b0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a6d0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
a6e0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
a6f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a700: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
a710: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
a720: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
a730: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
a740: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
a750: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a760: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
a770: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
a780: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
a790: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
a7a0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
a7b0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a7d0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
a7e0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
a7f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a800: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
a810: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
a820: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
a830: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
a840: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
a850: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
a860: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
a870: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
a880: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
a890: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a8b0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
a8c0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
a8d0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
a8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
a8f0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
a900: 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73  index */...  ass
a910: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
a920: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a930: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a940: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a950: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a960: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
a970: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
a980: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a990: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
a9a0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
a9b0: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
a9c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a9d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a9e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
a9f0: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
aa00: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
aa10: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
aa20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
aa30: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
aa40: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
aa50: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
aa60: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
aa70: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
aa80: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
aa90: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
aaa0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
aab0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
aac0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
aad0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
aae0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
aaf0: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
ab00: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
ab10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
ab20: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
ab30: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
ab40: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
ab50: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
ab60: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
ab70: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
ab80: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
ab90: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
aba0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
abb0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
abc0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
abd0: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20  lLast );.    /* 
abe0: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
abf0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
ac00: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
ac10: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
ac20: 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20     ** if PRAGMA 
ac30: 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d  cell_size_check=
ac40: 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ON..    */.    i
ac50: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
ac60: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
ac70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ac80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ac90: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
aca0: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
acb0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
acc0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
acd0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
ace0: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
acf0: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
ad00: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
ad10: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
ad20: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
ad30: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
ad40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ad50: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ad60: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ad70: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
ad80: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
ad90: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
ada0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
adb0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
adc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
add0: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
ade0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74  eSize );.    put
adf0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
ae00: 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70  k);.    if( temp
ae10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
ae20: 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62   x;.      if( cb
ae30: 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75  rk==pc ) continu
ae40: 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20  e;.      temp = 
ae50: 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
ae60: 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74  Space(pPage->pBt
ae70: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
ae80: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
ae90: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
aea0: 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b     memcpy(&temp[
aeb0: 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63  x], &data[x], (c
aec0: 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a  brk+size) - x);.
aed0: 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70        src = temp
aee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
aef0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
af00: 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  &src[pc], size);
af10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
af20: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
af30: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
af40: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
af50: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
af60: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
af70: 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +2] = 0;.  data[
af80: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65  hdr+7] = 0;.  me
af90: 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c  mset(&data[iCell
afa0: 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d  First], 0, cbrk-
afb0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61  iCellFirst);.  a
afc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
afd0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
afe0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
aff0: 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65  ;.  if( cbrk-iCe
b000: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
b010: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
b020: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b030: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
b040: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  .}../*.** Search
b060: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f   the free-list o
b070: 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73  n page pPg for s
b080: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
b090: 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73  cell nByte bytes
b0a0: 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20   in.** size. If 
b0b0: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
b0c0: 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
b0d0: 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20  er to the space 
b0e0: 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a  and remove it.**
b0f0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
b100: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ist..**.** If no
b110: 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20   suitable space 
b120: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20  can be found on 
b130: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72  the free-list, r
b140: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
b150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b160: 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75  may detect corru
b170: 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67  ption within pPg
b180: 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e  .  If corruption
b190: 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20   is.** detected 
b1a0: 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74  then *pRc is set
b1b0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   to SQLITE_CORRU
b1c0: 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72  PT and NULL is r
b1d0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
b1e0: 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65  lots on the free
b1f0: 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62   list that are b
b200: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62  etween 1 and 3 b
b210: 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ytes larger than
b220: 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62   nByte.** will b
b230: 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64  e ignored if add
b240: 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70  ing the extra sp
b250: 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d  ace to the fragm
b260: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a  entation count.*
b270: 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61  * causes the fra
b280: 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74  gmentation count
b290: 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a   to exceed 60..*
b2a0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
b2b0: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
b2c0: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
b2d0: 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  e, int *pRc){.  
b2e0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
b2f0: 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
b300: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
b310: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
b320: 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68  .  int iAddr = h
b330: 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63  dr + 1;.  int pc
b340: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b350: 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e  ta[iAddr]);.  in
b360: 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c  t x;.  int usabl
b370: 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
b380: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
b390: 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b   assert( pc>0 );
b3a0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73  .  do{.    int s
b3b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b3c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
b3d0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
b3e0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
b3f0: 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72  R-06866-39125 Fr
b400: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77  eeblocks are alw
b410: 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e  ays connected in
b420: 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a   order of.    **
b430: 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73   increasing offs
b440: 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  et. */.    if( p
b450: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
b460: 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a  | pc<iAddr+4 ){.
b470: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
b480: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b490: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
b4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
b4b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
b4c0: 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68  710-53328 The th
b4d0: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62  ird and fourth b
b4e0: 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20  ytes of each.   
b4f0: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f   ** freeblock fo
b500: 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  rm a big-endian 
b510: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b520: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b530: 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a   freeblock.    *
b540: 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c  * in bytes, incl
b550: 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65  uding the 4-byte
b560: 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
b570: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b580: 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  &aData[pc+2]);. 
b590: 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65     if( (x = size
b5a0: 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a   - nByte)>=0 ){.
b5b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b5c0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65  x==4 );.      te
b5d0: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
b5e0: 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70        if( pc < p
b5f0: 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  Pg->cellOffset+2
b600: 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73  *pPg->nCell || s
b610: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
b620: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
b630: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
b640: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b650: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
b660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34     }else if( x<4
b670: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
b680: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
b690: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
b6a0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
b6b0: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
b6c0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
b6d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b6e0: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
b6f0: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
b700: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
b710: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
b720: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
b730: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
b740: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
b750: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
b760: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
b770: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
b780: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
b790: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
b7a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
b7b0: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
b7c0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
b7d0: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
b7e0: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
b7f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
b800: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
b810: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
b820: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
b830: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
b840: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
b850: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
b860: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
b870: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
b880: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
b890: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
b8a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b8b0: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
b8c0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
b8d0: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
b8e0: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
b8f0: 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65  a[pc]);.  }while
b900: 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72  ( pc );..  retur
b910: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
b920: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
b930: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
b940: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
b950: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
b960: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
b970: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
b980: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
b990: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
b9a0: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
b9b0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b9c0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
b9d0: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
b9e0: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
b9f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
ba00: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
ba10: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
ba20: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
ba30: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
ba40: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
ba50: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
ba60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
ba70: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
ba80: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
ba90: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
baa0: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
bab0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
bac0: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
bad0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
bae0: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
baf0: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
bb00: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
bb10: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
bb20: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
bb30: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
bb40: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
bb50: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
bb60: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
bb70: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
bb80: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
bb90: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
bba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bbb0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
bbc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
bbd0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
bbe0: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
bbf0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
bc00: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
bc10: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
bc20: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
bc30: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
bc40: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bc50: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
bc60: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
bc70: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
bc80: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bcb0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
bcc0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
bcd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bcf0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
bd00: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
bd10: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
bd20: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
bd30: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
bd40: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
bd50: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
bd60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bd70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bd80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bda0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
bdb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bdc0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bdd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bde0: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
bdf0: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
be00: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
be10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
be20: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
be30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
be40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
be50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
be60: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
be70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
be80: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
be90: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
bea0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
beb0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bec0: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
bed0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
bee0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
bef0: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
bf00: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
bf10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
bf20: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
bf30: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
bf40: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
bf50: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
bf60: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
bf70: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
bf80: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
bf90: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
bfa0: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
bfb0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
bfc0: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
bfd0: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
bfe0: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
bff0: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
c000: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
c010: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
c020: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
c030: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
c040: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
c050: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
c060: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
c070: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c080: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
c090: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
c0a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
c0b0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
c0c0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
c0d0: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
c0e0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
c0f0: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
c100: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
c110: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
c120: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
c130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
c140: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c150: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
c160: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
c170: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
c180: 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64   between gap and
c190: 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72   top for one mor
c1a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20  e cell pointer. 
c1b0: 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20   ** array entry 
c1c0: 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74  offset, and if t
c1d0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
c1e0: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
c1f0: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
c200: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
c210: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
c220: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
c230: 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73  tisfy the reques
c240: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
c250: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
c260: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
c270: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
c280: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
c290: 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b   );.  if( (data[
c2a0: 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68  hdr+2] || data[h
c2b0: 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c  dr+1]) && gap+2<
c2c0: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a  =top ){.    u8 *
c2d0: 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e  pSpace = pageFin
c2e0: 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79  dSlot(pPage, nBy
c2f0: 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  te, &rc);.    if
c300: 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  ( pSpace ){.    
c310: 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65    assert( pSpace
c320: 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63  >=data && (pSpac
c330: 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20  e - data)<65536 
c340: 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  );.      *pIdx =
c350: 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20   (int)(pSpace - 
c360: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74  data);.      ret
c370: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c380: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
c390: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c3a0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
c3b0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
c3c0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c  could not be ful
c3d0: 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66  filled using a f
c3e0: 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43  reelist slot.  C
c3f0: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
c400: 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74   if defragmentat
c410: 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
c420: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
c430: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
c440: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
c450: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
c460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c470: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f  e->nCell>0 || CO
c480: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
c490: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
c4a0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
c4b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c4c0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
c4d0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
c4e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
c4f0: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
c500: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
c510: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
c520: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
c530: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
c540: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c550: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
c560: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c570: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
c580: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
c590: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
c5a0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
c5b0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
c5c0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
c5d0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
c5e0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
c5f0: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
c600: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
c610: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
c620: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
c630: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
c640: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
c650: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
c660: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
c670: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
c680: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
c690: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
c6a0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
c6b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c6c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
c6d0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
c6e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c6f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
c700: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
c710: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
c720: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
c730: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c740: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
c750: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
c760: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
c770: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
c780: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
c790: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
c7a0: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
c7b0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
c7c0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
c7d0: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
c7e0: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
c7f0: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
c800: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
c810: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
c820: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
c830: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
c840: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
c850: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
c860: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
c870: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
c880: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
c890: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
c8a0: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
c8b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
c8c0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
c8d0: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
c8e0: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
c8f0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
c900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c910: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
c920: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
c930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c940: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
c950: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
c960: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
c970: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c9a0: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
c9b0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
c9c0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
c9f0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
ca00: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
ca10: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
ca40: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
ca50: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
ca60: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca80: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
ca90: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
caa0: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
cab0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
cac0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
cad0: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
cae0: 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73  ze */.  u32 iLas
caf0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  t = pPage->pBt->
cb00: 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a  usableSize-4; /*
cb10: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
cb20: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
cb30: 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64  et */.  u32 iEnd
cb40: 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a   = iStart + iSiz
cb50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
cb60: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
cb70: 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66 66   the iStart buff
cb80: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
cb90: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
cba0: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a  age->aData;   /*
cbb0: 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f   Page content */
cbc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
cbd0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
cbe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
cbf0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
cc00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
cc10: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
cc20: 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74  UPT_DB || iStart
cc30: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
cc40: 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
cc50: 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
cc60: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
cc70: 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67   || iEnd <= pPag
cc80: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cc90: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
cca0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ccb0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ccc0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ccd0: 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20  t( iSize>=4 );  
cce0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
ccf0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
cd00: 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
cd10: 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f  iLast );..  /* O
cd20: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
cd30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
cd40: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
cd50: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
cd60: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
cd70: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  abled */.  if( p
cd80: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
cd90: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
cda0: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
cdb0: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74 61  emset(&data[iSta
cdc0: 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a  rt], 0, iSize);.
cdd0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69    }..  /* The li
cde0: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
cdf0: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
ce00: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69  nding order.  Fi
ce10: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f  nd the .  ** spo
ce20: 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68  t on the list wh
ce30: 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c  ere iStart shoul
ce40: 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20  d be inserted.. 
ce50: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
ce60: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
ce70: 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  iPtr = hdr + 1;.
ce80: 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b    if( data[iPtr+
ce90: 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50  1]==0 && data[iP
cea0: 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46  tr]==0 ){.    iF
ceb0: 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20  reeBlk = 0;  /* 
cec0: 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65  Shortcut for the
ced0: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66   case when the f
cee0: 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
cef0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
cf00: 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c   while( (iFreeBl
cf10: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
cf20: 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20  ta[iPtr]))>0 && 
cf30: 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20  iFreeBlk<iStart 
cf40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
cf50: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72  eeBlk<iPtr+4 ) r
cf60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
cf70: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
cf80: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
cf90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cfa0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
cfb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cfc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
cfd0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
cfe0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
cff0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d000: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d010: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d020: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d030: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d040: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d050: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d060: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d070: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d080: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d090: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d0a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d0b0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d0c0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d0d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d0e0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d0f0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
d100: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
d110: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
d120: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
d130: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
d140: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
d150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
d170: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
d180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d190: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
d1a0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
d1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d1c0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
d1d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d1e0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
d1f0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
d200: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
d210: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d220: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
d230: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
d240: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
d250: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
d260: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
d270: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
d280: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
d290: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
d2a0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
d2b0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
d2c0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
d2d0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
d2e0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
d2f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
d300: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
d310: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
d320: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
d330: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
d340: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
d350: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
d360: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
d370: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
d380: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d390: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
d3a0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
d3b0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
d3c0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
d3d0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
d3e0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
d3f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d400: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
d410: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
d420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d430: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
d440: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
d450: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
d460: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
d470: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
d480: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
d490: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
d4a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
d4b0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d4c0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
d4d0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
d4e0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
d4f0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
d500: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
d510: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
d520: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
d530: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
d540: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d550: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
d560: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
d570: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
d580: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d590: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
d5a0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
d5b0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
d5c0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
d5d0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
d5e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d5f0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
d600: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
d610: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
d620: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
d630: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
d640: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
d650: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
d660: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
d670: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d680: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
d690: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
d6a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
d6b0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
d6c0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
d6d0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
d6e0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
d6f0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
d700: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
d710: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
d720: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
d730: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
d740: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
d750: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
d760: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
d770: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
d780: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
d790: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
d7a0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
d7b0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
d7c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
d7d0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
d7e0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
d7f0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
d800: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
d810: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
d820: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
d830: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
d840: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d850: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
d860: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
d870: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
d880: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
d890: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
d8a0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
d8b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d8c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d8d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d8e0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
d8f0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
d900: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
d910: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
d920: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
d930: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
d940: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d950: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
d960: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
d970: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
d980: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
d990: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
d9a0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
d9b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
d9c0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
d9d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33  VIDENCE-OF: R-03
d9e0: 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75  640-13415 A valu
d9f0: 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65  e of 5 means the
da00: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
da10: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  rior.    ** tabl
da20: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
da30: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
da40: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
da50: 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20  INTKEY)==5 );.  
da60: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
da70: 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20  : R-20501-61796 
da80: 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65  A value of 13 me
da90: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
daa0: 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61  a leaf.    ** ta
dab0: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
dac0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
dad0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
dae0: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
daf0: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
db00: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
db10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
db20: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
db30: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
db40: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
db50: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b  ->noPayload = 0;
db60: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
db70: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
db80: 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20  ParseCellPtr;.  
db90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
dba0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
dbb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
dbc0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31  e->noPayload = 1
dbd0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
dbe0: 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53  CellSize = cellS
dbf0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  izePtrNoPayload;
dc00: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50  .      pPage->xP
dc10: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
dc20: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
dc30: 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20  yload;.    }.   
dc40: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
dc50: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
dc60: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
dc70: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
dc80: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
dc90: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
dca0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f  ERODATA ){.    /
dcb0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
dcc0: 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76  -27225-53936 A v
dcd0: 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20  alue of 2 means 
dce0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69  the page is an i
dcf0: 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69  nterior.    ** i
dd00: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
dd10: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
dd20: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d   (PTF_ZERODATA)=
dd30: 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =2 );.    /* EVI
dd40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37  DENCE-OF: R-1657
dd50: 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20  1-11615 A value 
dd60: 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20  of 10 means the 
dd70: 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20  page is a leaf. 
dd80: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
dd90: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
dda0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
ddb0: 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
ddc0: 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
ddd0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
dde0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
ddf0: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
de00: 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20  ge->noPayload = 
de10: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  0;.    pPage->xP
de20: 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65  arseCell = btree
de30: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
de40: 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  x;.    pPage->ma
de50: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
de60: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
de70: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
de80: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
de90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
dea0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30  DENCE-OF: R-4760
deb0: 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65  8-56469 Any othe
dec0: 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  r value for the 
ded0: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
dee0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   is.    ** an er
def0: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ror. */.    retu
df00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
df10: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
df20: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
df30: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
df40: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
df50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
df70: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
df80: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
df90: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
dfa0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
dfb0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
dfc0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
dfd0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
dfe0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
dff0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
e000: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
e010: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
e020: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
e030: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
e040: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
e050: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
e060: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
e070: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
e080: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
e090: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
e0a0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
e0b0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
e0c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
e0d0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
e0e0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
e0f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e100: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e110: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
e120: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e130: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e140: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e150: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e160: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
e170: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e180: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
e190: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
e1a0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
e1b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
e1c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e1d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e1e0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
e1f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
e200: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
e210: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
e220: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
e230: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
e240: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e250: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
e260: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
e270: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
e280: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
e290: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
e2a0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
e2b0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
e2c0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
e2d0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
e2e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
e2f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
e300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
e310: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
e320: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
e330: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
e340: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
e350: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e360: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
e370: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
e380: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
e390: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
e3a0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
e3b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
e3c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
e3d0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
e3e0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
e3f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
e400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e410: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
e420: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
e440: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
e450: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
e460: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e470: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
e480: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
e490: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
e4a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
e4b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
e4c0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
e4d0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
e4e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
e4f0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
e500: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
e510: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e520: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
e530: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
e540: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
e550: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
e560: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
e570: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
e580: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
e590: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
e5a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e5b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
e5c0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
e5d0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
e5e0: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
e5f0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
e600: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
e610: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
e620: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
e630: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
e640: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
e650: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
e660: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
e670: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
e680: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
e690: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e6a0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
e6b0: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
e6c0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
e6d0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
e6e0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
e6f0: 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  set];.    pPage-
e700: 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61  >aDataOfst = &da
e710: 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ta[pPage->childP
e720: 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20  trSize];.    /* 
e730: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
e740: 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
e750: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
e760: 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
e770: 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68  gnates.    ** th
e780: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e790: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e7a0: 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66  . A zero value f
e7b0: 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20  or this integer 
e7c0: 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70  is.    ** interp
e7d0: 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20  reted as 65536. 
e7e0: 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  */.    top = get
e7f0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
e800: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
e810: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e820: 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
e830: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
e840: 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
e850: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
e860: 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
e870: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  on the page. */.
e880: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
e890: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e8a0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
e8b0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
e8c0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
e8d0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
e8e0: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
e8f0: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
e900: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
e910: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
e920: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e930: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
e940: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
e950: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
e960: 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f  LL(pBt) );.    /
e970: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e980: 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20  -24089-57979 If 
e990: 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  a page contains 
e9a0: 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20  no cells (which 
e9b0: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70  is only.    ** p
e9c0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
e9d0: 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
e9e0: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
e9f0: 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
ea00: 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74  he.    ** offset
ea10: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
ea20: 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
ea30: 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
ea40: 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20  ze minus the.   
ea50: 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73   ** bytes of res
ea60: 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a  erved space. */.
ea70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ea80: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
ea90: 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
eaa0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
eab0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
eac0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
ead0: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
eae0: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
eaf0: 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70   end.    ** of p
eb00: 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
eb10: 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a   a cell.  .    *
eb20: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
eb30: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
eb40: 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c  code checks earl
eb50: 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65  y to see if a ce
eb60: 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a  ll extends.    *
eb70: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
eb80: 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
eb90: 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
eba0: 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
ebb0: 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e .    ** return
ebc0: 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
ebd0: 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46     */.    iCellF
ebe0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
ebf0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
ec00: 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73  ll;.    iCellLas
ec10: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
ec20: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   4;.    if( pBt-
ec30: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
ec40: 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29  ITE_CellSizeCk )
ec50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
ec60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ec70: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
ec80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
ec90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
eca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ecb0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
ecc0: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ecd0: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ece0: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
ecf0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
ed00: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
ed10: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
ed20: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
ed30: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
ed40: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
ed50: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
ed60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ed70: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
ed80: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
ed90: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
eda0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
edb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
edc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
edd0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
ede0: 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
edf0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
ee00: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
ee10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ee20: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
ee30: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
ee40: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
ee50: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
ee60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ee70: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ee80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ee90: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
eea0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
eeb0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20  +;.    }  ..    
eec0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
eed0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
eee0: 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  on the page.    
eef0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ef00: 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
ef10: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ef20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
ef30: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
ef40: 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
ef50: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
ef60: 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
ef70: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
ef80: 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65  e no.    ** free
ef90: 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70  blocks. */.    p
efa0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
efb0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
efc0: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
efd0: 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
efe0: 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
eff0: 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
f000: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69  space */.    whi
f010: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
f020: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
f030: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
f040: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
f050: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
f060: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
f070: 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
f080: 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
f090: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
f0a0: 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
f0b0: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
f0c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
f0d0: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
f0e0: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
f0f0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
f100: 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65    ** Or, the fre
f110: 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68  eblock is off th
f120: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
f130: 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
f140: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f150: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f160: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
f170: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
f180: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f190: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
f1a0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
f1b0: 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
f1c0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
f1d0: 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
f1e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
f1f0: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
f200: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
f210: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f220: 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
f230: 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  yte of.        *
f240: 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  * the free-block
f250: 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65   must lie on the
f260: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
f270: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
f280: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f290: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
f2a0: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
f2b0: 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
f2c0: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
f2d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
f2e0: 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
f2f0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
f300: 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
f310: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
f320: 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
f330: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
f340: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
f350: 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
f360: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
f370: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
f380: 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
f390: 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
f3a0: 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
f3b0: 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
f3c0: 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
f3d0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
f3e0: 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
f3f0: 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
f400: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
f410: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
f420: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
f430: 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
f440: 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
f450: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
f460: 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
f470: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
f480: 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
f490: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f4a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f4b0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f4c0: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
f4d0: 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
f4e0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
f4f0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
f500: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
f510: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f520: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
f530: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
f540: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
f550: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
f560: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
f570: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
f580: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
f590: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
f5a0: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
f5b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
f5c0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
f5d0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
f5e0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
f5f0: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
f600: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
f610: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
f620: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
f630: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
f640: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
f650: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
f660: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
f670: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
f680: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
f690: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
f6a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f6b0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
f6c0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
f6d0: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
f6e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
f6f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
f700: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f710: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f720: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f730: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
f740: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
f750: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
f760: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
f770: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
f780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
f790: 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
f7a0: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
f7b0: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
f7c0: 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
f7d0: 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
f7e0: 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
f7f0: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
f800: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
f810: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
f820: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
f830: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
f840: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
f850: 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
f860: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
f870: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
f880: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
f890: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
f8a0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
f8b0: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
f8c0: 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
f8d0: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
f8e0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
f8f0: 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
f900: 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
f910: 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
f920: 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
f930: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
f940: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
f950: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
f960: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
f970: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
f980: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
f990: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
f9a0: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
f9b0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
f9c0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
f9d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
f9e0: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
f9f0: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
fa00: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
fa10: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
fa20: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
fa30: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
fa40: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
fa50: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
fa60: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
fa70: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
fa80: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
fa90: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
faa0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
fab0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
fac0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
fad0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
fae0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
faf0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
fb00: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
fb10: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
fb20: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
fb30: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
fb40: 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
fb50: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
fb60: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
fb70: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
fb80: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
fb90: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
fba0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
fbb0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
fbc0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
fbd0: 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20  ded.  See also: 
fbe0: 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
fbf0: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge()..**.** If t
fc00: 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  he PAGER_GET_NOC
fc10: 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73  ONTENT flag is s
fc20: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
fc30: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
fc40: 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f  .** about the co
fc50: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
fc60: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
fc70: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
fc80: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
fc90: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
fca0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
fcb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
fcc0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
fcd0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
fce0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
fcf0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
fd00: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
fd10: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
fd20: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
fd30: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
fd40: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
fd50: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
fd60: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
fd70: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
fd80: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
fd90: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
fda0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
fdb0: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
fdc0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
fdd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fde0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
fdf0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
fe00: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
fe10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
fe20: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
fe30: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
fe40: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
fe50: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
fe60: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
fe70: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
fe80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
fe90: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
fea0: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
feb0: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
fec0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
fed0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
fee0: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
fef0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ff10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
ff20: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
ff30: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
ff40: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
ff50: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
ff60: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
ff70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
ff80: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
ff90: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
ffa0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
ffb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ffc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ffd0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
ffe0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
fff0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
10000 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
10010 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
10020 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
10030 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
10040 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10050 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10060 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10070 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
10080 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10090 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
100a0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
100b0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
100c0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
100d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
100e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
100f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
10100 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
10110 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
10120 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
10130 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
10140 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
10150 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10160 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
10170 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
10180 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
10190 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
101a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
101b0 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
101c0 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
101d0 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
101e0 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
101f0 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
10200 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
10210 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
10220 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
10230 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
10240 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
10250 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
10260 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
10270 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
10280 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
10290 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
102a0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
102b0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
102c0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
102d0 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
102e0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
102f0 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
10300 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a  itialize it..**.
10310 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68  ** If pCur!=0 th
10320 65 6e 20 74 68 65 20 70 61 67 65 20 61 63 71 75  en the page acqu
10330 69 72 65 64 20 77 69 6c 6c 20 62 65 20 61 64 64  ired will be add
10340 65 64 20 74 6f 20 74 68 61 74 20 63 75 72 73 6f  ed to that curso
10350 72 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 65 74  r..** If the fet
10360 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
10370 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
10380 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
10390 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
103a0 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
103b0 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
103c0 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
103d0 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
103e0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
103f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10400 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
10410 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
10420 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
10430 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
10440 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
10450 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
10460 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
10470 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
10480 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10490 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
104a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
104b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
104c0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
104f0 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
10500 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10510 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
10520 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
10530 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
10540 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
10550 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
10560 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
10570 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
10580 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
10590 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
105a0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
105b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
105c0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
105d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
105e0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
105f0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10610 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10630 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
10640 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
10650 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
10660 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10670 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
10680 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
10690 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
106a0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
106b0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
106c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
106d0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
106e0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
106f0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
10700 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
10710 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10720 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10730 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10740 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10750 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10760 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10770 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62   }.  *ppPage = b
10780 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
10790 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
107a0 2c 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a  , pBt);.  if( (*
107b0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
107c0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  =0 ){.    rc = b
107d0 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
107e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
107f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10800 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
10810 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
10820 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
10830 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
10840 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
10850 6f 62 74 61 69 6e 69 6e 67 20 61 20 70 61 67 65  obtaining a page
10860 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
10870 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
10880 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
10890 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
108a0 69 74 68 20 74 68 65 20 63 75 72 73 6f 72 20 2a  ith the cursor *
108b0 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
108c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 0a 20 20  pCur->iPage>0.  
108d0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
108e0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
108f0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
10900 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
10910 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20  ntKey).  ){.    
10920 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
10930 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
10940 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
10950 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
10960 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10970 72 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  r;.  }..  testca
10980 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
10990 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
109a0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
109b0 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
109c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
109d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
109e0 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20  ror:.  if( pCur 
109f0 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b  ) pCur->iPage--;
10a00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10a10 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
10a20 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
10a30 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
10a40 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
10a50 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
10a60 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
10a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
10a80 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
10a90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10aa0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10ab0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
10ac0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
10ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10ae0 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
10af0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10b00 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
10b10 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10b20 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
10b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10b40 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10b50 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
10b60 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
10b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10b80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10b90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
10ba0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
10bb0 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
10bc0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10bd0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
10be0 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
10bf0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
10c00 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
10c10 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
10c20 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
10c30 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
10c40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
10c50 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
10c60 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
10c70 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
10c80 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
10c90 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
10ca0 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
10cb0 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
10cc0 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
10cd0 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
10ce0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
10cf0 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
10d00 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
10d10 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
10d20 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
10d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10d40 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
10d50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10d60 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
10d70 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
10d80 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
10d90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10da0 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
10db0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
10dc0 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
10dd0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
10de0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
10df0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
10e00 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
10e10 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
10e20 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
10e30 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
10e40 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
10e50 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
10e60 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
10e70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10e80 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
10e90 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
10ea0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
10eb0 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
10ec0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10ed0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
10ee0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
10ef0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10f10 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
10f20 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
10f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
10f40 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
10f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
10f60 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
10f70 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
10f80 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
10f90 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
10fa0 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
10fb0 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
10fc0 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
10fd0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
10fe0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
10ff0 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
11000 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
11010 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
11020 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11030 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
11040 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
11050 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
11060 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
11070 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
11080 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
11090 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
110a0 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
110b0 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
110c0 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
110d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
110e0 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
110f0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
11100 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
11110 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
11120 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11130 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
11140 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
11150 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
11160 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11170 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
11180 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
11190 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
111a0 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
111b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
111c0 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
111d0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
111e0 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
111f0 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
11200 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
11210 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
11220 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
11230 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
11240 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
11250 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
11260 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
11270 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
11280 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
11290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
112a0 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
112b0 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
112c0 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
112d0 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
112e0 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
112f0 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
11300 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
11310 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
11320 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
11330 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
11340 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
11350 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
11360 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
11370 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
11380 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
11390 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
113a0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
113b0 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
113c0 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
113d0 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
113e0 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
113f0 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
11400 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
11410 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
11420 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
11430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11440 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11450 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
11460 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
11470 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11480 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
11490 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
114a0 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
114b0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
114c0 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
114d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
114e0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
114f0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
11500 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
11510 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
11520 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
11530 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11540 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
11550 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
11560 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
11570 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
11580 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
11590 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
115a0 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
115b0 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
115c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
115d0 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
115e0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
115f0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
11600 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
11610 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
11620 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
11630 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
11640 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
11650 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
11660 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
11670 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
11680 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
11690 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
116a0 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
116b0 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
116c0 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
116d0 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
116e0 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
116f0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
11700 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
11710 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
11720 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11730 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
11740 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
11750 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
11760 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
11770 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
11780 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
11790 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
117a0 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
117b0 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
117c0 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
117d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
117e0 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
117f0 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
11800 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
11810 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
11820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
11830 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
11840 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
11850 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
11860 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
11870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11880 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
11890 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
118a0 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
118b0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
118c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
118d0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
118e0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
118f0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
11900 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
11910 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
11920 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
11930 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
11940 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
11950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
11960 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
11970 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
11980 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
11990 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
119a0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
119b0 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
119c0 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
119d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
119e0 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
119f0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
11a00 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a20 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
11a30 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
11a40 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
11a50 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
11a60 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
11a70 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
11a80 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
11a90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
11aa0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
11ab0 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
11ac0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
11ad0 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11af0 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
11b00 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
11b10 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
11b20 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
11b30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
11b40 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
11b50 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
11b60 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
11b70 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
11b80 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
11b90 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
11ba0 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
11bb0 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
11bc0 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
11bd0 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
11be0 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
11bf0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
11c00 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
11c10 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
11c20 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
11c30 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
11c40 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
11c50 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
11c60 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
11c70 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
11c80 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
11c90 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
11ca0 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
11cb0 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11cd0 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
11ce0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
11cf0 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11d10 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
11d20 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
11d30 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
11d40 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
11d50 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
11d60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
11d70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11d80 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
11d90 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
11da0 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
11db0 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
11dc0 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
11dd0 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
11de0 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
11df0 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
11e00 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
11e10 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
11e20 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
11e30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
11e40 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
11e50 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
11e60 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
11e70 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
11e80 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
11e90 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
11ea0 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
11eb0 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
11ec0 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
11ed0 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
11ee0 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
11ef0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
11f00 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
11f10 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11f20 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
11f30 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
11f40 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
11f50 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
11f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
11f70 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
11f80 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
11f90 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
11fa0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
11fb0 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
11fc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
11fd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11fe0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
11ff0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
12000 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
12010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
12020 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
12030 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
12040 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
12050 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
12060 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12070 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12080 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
12090 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
120a0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
120b0 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
120c0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
120d0 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
120e0 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
120f0 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
12100 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
12110 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
12120 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
12130 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
12140 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
12150 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
12160 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
12170 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
12180 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
12190 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
121a0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
121b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
121c0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
121d0 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
121e0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
121f0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
12200 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
12210 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
12220 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
12230 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
12240 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
12250 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
12260 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
12270 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
12280 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
12290 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
122a0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
122b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
122c0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
122d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
122e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
122f0 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
12300 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
12310 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
12320 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
12330 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12340 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12350 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12360 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12370 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
123a0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
123b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
123c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
123d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
123e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
123f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12400 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
12410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12430 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
12440 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
12450 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
12460 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
12470 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
12480 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
12490 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
124a0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
124b0 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
124c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
124d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
124e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
124f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12500 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
12510 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
12520 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
12530 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
12540 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12550 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
12560 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
12570 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12580 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
12590 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
125a0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
125b0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
125c0 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
125d0 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
125e0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
125f0 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
12600 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
12610 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
12620 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
12630 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
12640 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
12650 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
12660 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
12670 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
12680 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12690 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
126a0 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
126b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
126c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
126d0 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
126e0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
126f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12700 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
12710 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
12730 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12740 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12750 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
12760 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12770 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
12780 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
12790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
127a0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
127b0 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
127c0 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
127d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
127e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
127f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12800 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
12810 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
12820 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
12830 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
12840 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12850 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
12860 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
12870 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
12880 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
12890 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
128a0 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
128b0 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
128c0 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
128d0 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
128e0 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
128f0 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
12900 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
12910 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
12920 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
12930 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
12940 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
12950 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
12960 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
12970 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
12980 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
12990 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
129a0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
129b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
129c0 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
129d0 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
129e0 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
129f0 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
12a00 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
12a10 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
12a20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
12a30 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
12a40 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
12a50 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
12a60 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
12a70 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
12a80 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
12a90 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
12aa0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
12ab0 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
12ac0 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
12ad0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
12ae0 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
12af0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
12b00 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
12b10 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
12b20 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
12b30 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
12b40 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
12b50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12b60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12b70 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
12b80 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
12b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12ba0 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
12bb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
12bc0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
12bf0 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
12c00 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
12c10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12c30 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
12c40 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
12c50 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
12c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
12c70 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
12c80 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
12c90 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
12ca0 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
12cb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
12cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12cd0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
12ce0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
12cf0 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
12d00 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
12d10 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
12d20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
12d30 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
12d40 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
12d50 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12d60 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
12d70 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
12d80 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
12d90 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
12da0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
12db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
12dc0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
12dd0 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
12de0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
12df0 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
12e00 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
12e10 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
12e20 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
12e30 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
12e40 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
12e50 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
12e60 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
12e70 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
12e80 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
12e90 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
12ea0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
12eb0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
12ec0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
12ed0 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
12ee0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
12ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12f00 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
12f10 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
12f20 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
12f30 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
12f40 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
12f50 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
12f60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
12f70 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
12f80 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
12f90 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
12fa0 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
12fb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
12fc0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
12fd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12fe0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12ff0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
13000 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
13010 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
13020 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13030 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
13040 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
13050 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
13060 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
13070 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
13080 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13090 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
130a0 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
130b0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
130c0 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
130d0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
130e0 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
130f0 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
13100 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
13110 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
13120 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
13130 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
13140 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
13150 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
13160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13170 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
13180 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
13190 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
131a0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
131b0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
131c0 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
131d0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
131e0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
131f0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
13200 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
13210 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13220 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
13230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13240 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
13250 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
13260 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
13270 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
13280 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
13290 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
132a0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
132b0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
132c0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
132d0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
132e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
132f0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
13300 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
13310 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
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 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
13350 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13360 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
13370 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
13380 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
13390 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
133a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
133b0 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
133c0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
133d0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
133e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
133f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13400 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
13410 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
13420 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
13430 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
13440 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
13450 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
13460 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
13470 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
13480 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
13490 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
134a0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
134b0 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
134c0 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
134d0 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
134e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
134f0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
13500 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13510 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
13520 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
13530 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
13540 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
13550 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
13560 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
13570 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
13580 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
13590 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
135a0 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
135b0 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d  ed; ).      pBt-
135c0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
135d0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
135e0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
135f0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
13600 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
13610 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
13620 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
13630 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
13640 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
13650 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
13660 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
13670 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13680 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13690 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
136a0 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
136b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
136c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
136d0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
136e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
136f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
13700 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13720 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13730 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
13740 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
13750 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
13760 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
13770 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
13780 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
13790 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
137a0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
137b0 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
137c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
137d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
137e0 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
137f0 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
13800 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13810 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
13820 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
13830 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
13840 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
13850 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
13860 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
13870 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
13880 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
13890 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
138a0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
138b0 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
138c0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
138d0 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
138e0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
138f0 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
13900 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
13910 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
13920 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
13930 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
13940 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
13950 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
13960 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
13970 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
13980 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
13990 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
139a0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
139b0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
139c0 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
139d0 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
139e0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
139f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
13a00 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
13a10 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
13a20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
13a30 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
13a40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
13a50 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
13a60 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
13a70 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
13a80 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
13a90 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
13aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13ab0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
13ac0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
13ad0 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
13ae0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
13af0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
13b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
13b10 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
13b20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13b30 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
13b40 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
13b50 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
13b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13b70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
13b80 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
13b90 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
13ba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13bb0 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
13bc0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
13bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13be0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
13bf0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
13c00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
13c10 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
13c20 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
13c30 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
13c40 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
13c50 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
13c60 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
13c70 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
13c80 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
13c90 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
13ca0 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
13cb0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
13cc0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
13cd0 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
13ce0 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
13cf0 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
13d00 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
13d10 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13d20 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
13d30 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
13d40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13d50 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
13d60 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
13d70 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
13d80 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  SIZE);.    }.  }
13d90 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
13da0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13db0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13dc0 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
13dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
13de0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
13df0 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
13e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
13e10 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
13e20 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
13e30 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
13e40 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
13e50 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
13e60 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
13e70 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
13e80 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
13e90 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
13ea0 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
13eb0 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
13ec0 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
13ed0 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
13ee0 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
13ef0 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
13f00 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
13f10 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
13f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f30 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13f40 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13f50 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
13f60 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72  ster; ).  BtShar
13f70 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
13f80 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
13f90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13fa0 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
13fb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
13fc0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
13fd0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
13fe0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13ff0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14000 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
14010 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
14020 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
14030 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
14040 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
14050 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
14060 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14070 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
14080 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
14090 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
140a0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
140b0 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
140c0 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
140d0 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
140e0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
140f0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14100 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
14110 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
14120 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
14130 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
14140 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
14150 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
14160 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
14170 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
14180 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
14190 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
141a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
141b0 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
141c0 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
141d0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
141e0 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
141f0 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
14200 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
14210 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
14220 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
14230 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
14240 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
14250 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
14260 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
14270 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
14280 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
14290 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
142a0 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20  pBt) bytes with 
142b0 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20  a 4-byte prefix 
142c0 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64  for a left-child
142d0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  .** pointer..*/.
142e0 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
142f0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
14300 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14310 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
14320 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
14330 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
14340 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
14350 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
14360 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74  .    /* One of t
14370 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e  he uses of pBt->
14380 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20  pTmpSpace is to 
14390 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66  format cells bef
143a0 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ore.    ** inser
143b0 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61  ting them into a
143c0 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63   leaf page (func
143d0 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  tion fillInCell(
143e0 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20  )). If.    ** a 
143f0 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61  cell is less tha
14400 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 4 bytes in siz
14410 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64  e, it is rounded
14420 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20   up to 4 bytes. 
14430 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72     ** by the var
14440 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68  ious routines th
14450 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69  at manipulate bi
14460 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63  nary cells. Whic
14470 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61  h.    ** can mea
14480 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c  n that fillInCel
14490 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c  l() only initial
144a0 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32  izes the first 2
144b0 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74   or 3.    ** byt
144c0 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c  es of pTmpSpace,
144d0 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69   but that the fi
144e0 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20  rst 4 bytes are 
144f0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20  copied from.    
14500 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74  ** it into a dat
14510 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73  abase page. This
14520 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
14530 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20   a problem, but 
14540 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63  it.    ** does c
14550 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20  ause a valgrind 
14560 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31  error when the 1
14570 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75   or 2 bytes of u
14580 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
14590 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65  ** data is passe
145a0 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c  d to system call
145b0 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20   write(). So to 
145c0 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72  avoid this error
145d0 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68  ,.    ** zero th
145e0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
145f0 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65  of temp space he
14600 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  re..    **.    *
14610 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65  * Also:  Provide
14620 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
14630 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65  nitialized space
14640 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
14650 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  ** beginning of 
14660 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20  pTmpSpace as an 
14670 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74  area available t
14680 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20  o prepend the.  
14690 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20    ** left-child 
146a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
146b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65  eginning of a ce
146c0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ll..    */.    i
146d0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
146e0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  e ){.      memse
146f0 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
14700 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70  , 0, 8);.      p
14710 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d  Bt->pTmpSpace +=
14720 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   4;.    }.  }.}.
14730 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
14740 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
14750 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
14760 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
14770 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
14780 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
14790 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
147a0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
147b0 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69  e -= 4;.    sqli
147c0 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d  te3PageFree(pBt-
147d0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
147e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
147f0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
14800 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
14810 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
14820 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
14830 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
14840 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
14850 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
14860 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
14870 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
14880 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
14890 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
148a0 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
148b0 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
148c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
148d0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
148e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
148f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14900 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
14910 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
14920 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
14930 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
14940 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
14950 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
14960 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
14970 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
14980 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
14990 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
149a0 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
149b0 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
149c0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
149d0 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
149e0 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
149f0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
14a00 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
14a10 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
14a20 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
14a30 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
14a40 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
14a50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
14a60 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
14a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14a80 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
14a90 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
14aa0 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
14ab0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
14ac0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
14ad0 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
14ae0 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
14af0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
14b00 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
14b10 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
14b20 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
14b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
14b40 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
14b50 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
14b60 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
14b70 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
14b80 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
14b90 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
14ba0 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
14bb0 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
14bc0 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
14bd0 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
14be0 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
14bf0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
14c00 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
14c10 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
14c20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
14c30 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
14c40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
14c50 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
14c60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14c70 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
14c80 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
14c90 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
14ca0 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
14cb0 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
14cc0 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
14cd0 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
14ce0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
14cf0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
14d00 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
14d10 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
14d20 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14d30 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
14d40 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14d50 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
14d60 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
14d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
14d80 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
14d90 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
14da0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
14db0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
14dc0 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
14dd0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
14de0 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
14df0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
14e00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14e10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14e20 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
14e30 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
14e40 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
14e50 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
14e60 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
14e70 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
14e80 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
14e90 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
14ea0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
14eb0 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
14ec0 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
14ed0 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
14ee0 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
14ef0 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
14f00 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
14f10 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
14f20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
14f30 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
14f40 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
14f50 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
14f60 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
14f70 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
14f80 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
14f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
14fa0 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
14fb0 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
14fc0 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
14fd0 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
14fe0 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
14ff0 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
15000 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
15010 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
15020 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
15030 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
15040 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
15050 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
15060 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
15070 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
15080 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
15090 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
150a0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
150b0 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
150c0 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
150d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
150e0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
150f0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
15100 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
15110 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15120 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15130 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15140 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15150 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15160 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
15170 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
15180 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
15190 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
151a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
151b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
151c0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
151d0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
151e0 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
151f0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
15200 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
15210 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
15220 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
15230 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
15240 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
15250 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
15260 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
15270 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
15280 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15290 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
152a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
152b0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
152c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
152d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
152e0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
152f0 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
15300 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
15310 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15320 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15330 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15340 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
15350 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
15360 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15370 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
15380 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
15390 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
153a0 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
153b0 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
153c0 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
153d0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
153e0 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
153f0 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
15400 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
15410 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
15420 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
15430 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
15440 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
15450 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
15460 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
15470 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
15480 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
15490 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
154a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
154b0 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
154c0 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
154d0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
154e0 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
154f0 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
15500 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
15510 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
15520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15530 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
15540 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15550 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
15560 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
15570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
15580 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
15590 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
155a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
155b0 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
155c0 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
155d0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
155e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
155f0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15610 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15620 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15630 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15640 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
15650 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
15660 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
15670 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15690 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
156a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
156b0 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
156c0 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
156d0 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
156e0 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
156f0 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
15700 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
15710 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
15720 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
15730 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
15740 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
15750 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15760 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
15770 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
15780 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15790 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
157a0 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65    .  sqlite3Btre
157b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
157c0 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
157d0 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20  >pPager );.  rc 
157e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  = sqlite3PagerNo
157f0 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
15800 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15820 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15830 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
15840 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
15850 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
15860 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
15870 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
15880 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
15890 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
158a0 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
158b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
158c0 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
158d0 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
158e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
158f0 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
15900 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
15910 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
15920 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
15930 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
15940 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
15950 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
15960 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
15970 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
15980 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
15990 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
159a0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
159b0 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
159c0 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
159d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
159e0 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
159f0 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
15a00 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
15a10 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
15a20 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
15a30 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
15a40 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
15a50 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
15a60 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
15a70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
15a80 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
15a90 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
15aa0 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
15ab0 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
15ac0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
15ad0 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
15ae0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
15af0 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
15b00 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
15b10 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
15b20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
15b30 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
15b40 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
15b50 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
15b60 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
15b70 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
15b80 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
15b90 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
15ba0 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
15bb0 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
15bc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
15bd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15be0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15bf0 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
15c00 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
15c10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15c20 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
15c30 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
15c40 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
15c50 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
15c60 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
15c70 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
15c80 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
15c90 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
15ca0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
15cb0 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
15cc0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15cd0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
15ce0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15cf0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
15d00 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
15d10 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
15d20 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
15d30 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
15d40 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
15d50 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
15d60 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
15d70 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
15d80 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
15d90 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
15da0 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
15db0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
15dc0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
15dd0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
15de0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
15df0 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
15e00 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
15e10 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
15e20 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
15e30 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
15e40 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15e50 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
15e60 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
15e70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
15e80 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
15e90 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
15ea0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
15eb0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
15ec0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
15ed0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
15ee0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
15ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15f00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15f10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
15f20 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
15f30 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
15f40 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
15f50 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
15f60 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
15f70 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
15f80 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
15f90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15fa0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
15fb0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
15fc0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
15fd0 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
15fe0 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
15ff0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16000 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
16010 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
16020 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
16030 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
16040 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
16050 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
16060 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
16070 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
16080 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
16090 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
160a0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
160b0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
160c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
160d0 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
160e0 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
160f0 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
16100 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
16110 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
16120 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
16130 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
16140 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
16150 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
16160 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
16170 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
16180 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
16190 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
161a0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
161b0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
161c0 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
161d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
161e0 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
161f0 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
16200 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
16210 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
16220 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
16230 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16240 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16250 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
16260 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
16270 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
16280 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
16290 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
162a0 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
162b0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
162c0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
162d0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
162e0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
162f0 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
16300 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
16310 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
16320 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
16330 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
16340 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
16350 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
16360 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
16370 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
16380 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16390 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
163a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
163b0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
163c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
163d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
163e0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
163f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16400 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
16410 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
16420 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
16430 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
16440 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
16450 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16460 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16470 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
16480 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
16490 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
164a0 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
164b0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
164c0 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
164d0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
164e0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
164f0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
16500 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
16510 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
16520 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
16530 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
16540 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
16550 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
16560 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
16570 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
16580 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16590 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
165a0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
165b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
165c0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
165d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
165e0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
165f0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
16600 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
16610 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
16620 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
16630 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
16640 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
16650 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
16660 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
16670 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
16680 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
16690 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
166a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
166b0 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
166c0 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
166d0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
166e0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
166f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
16700 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16710 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
16720 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
16730 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
16740 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
16750 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
16760 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
16770 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
16780 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
16790 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
167a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
167b0 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
167c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
167d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
167e0 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
167f0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
16800 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
16810 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16820 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
16830 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
16840 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
16850 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
16860 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
16870 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
16880 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
16890 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
168a0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
168b0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
168c0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
168d0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
168e0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
168f0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
16900 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
16910 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
16920 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
16930 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
16940 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
16950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16960 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
16970 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16980 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
16990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
169a0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
169b0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
169c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
169d0 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
169e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
169f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
16a00 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
16a10 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16a20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
16a30 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
16a40 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
16a50 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
16a60 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
16a70 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
16a80 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
16a90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16aa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16ab0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16ac0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
16ad0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
16ae0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
16af0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
16b00 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
16b10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
16b20 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
16b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16b40 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
16b50 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
16b60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16b70 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
16b80 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
16b90 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
16ba0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
16bb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
16bc0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
16bd0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
16be0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
16bf0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
16c00 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
16c10 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
16c20 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
16c30 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
16c40 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
16c50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16c60 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
16c70 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
16c80 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
16c90 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
16ca0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
16cb0 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
16cc0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
16cd0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
16ce0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
16cf0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
16d00 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
16d10 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
16d20 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
16d30 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
16d40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
16d50 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
16d60 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
16d70 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
16d80 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
16d90 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
16da0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
16db0 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
16dc0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
16dd0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
16de0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
16df0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
16e00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16e10 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
16e20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
16e30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
16e40 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
16e50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16e60 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
16e70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
16e80 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
16e90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
16ea0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
16eb0 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
16ec0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
16ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16ee0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
16ef0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
16f00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
16f10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
16f20 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
16f30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
16f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16f50 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
16f60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
16f70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
16f80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
16f90 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
16fa0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
16fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16fc0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16fd0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
16fe0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
16ff0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17000 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17010 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
17020 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
17030 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
17040 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
17050 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
17060 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
17070 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
17080 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
17090 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
170a0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
170b0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
170c0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
170d0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
170e0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
170f0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
17100 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
17110 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
17120 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
17130 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
17140 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
17150 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
17160 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
17170 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
17180 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
17190 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
171a0 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
171b0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
171c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
171d0 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
171e0 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
171f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
17200 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
17210 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
17220 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
17230 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
17240 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
17250 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
17260 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
17270 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
17280 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
17290 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
172a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
172b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
172c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
172d0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
172e0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
172f0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17300 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
17310 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17320 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
17330 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17340 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17350 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
17360 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
17370 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
17380 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
17390 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
173a0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
173b0 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
173c0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
173d0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
173e0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
173f0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
17400 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
17410 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
17420 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
17430 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
17440 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
17450 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
17460 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
17470 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
17480 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
17490 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
174a0 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
174b0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
174c0 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
174d0 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
174e0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
174f0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
17500 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
17510 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
17520 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
17530 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
17540 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
17550 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
17560 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
17570 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
17580 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
17590 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
175a0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
175b0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
175c0 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
175d0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
175e0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
175f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17600 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
17610 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
17620 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
17630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17640 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
17650 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17660 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17670 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
17680 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17690 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
176a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
176b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
176c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
176d0 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  TADB;.    }.#end
176e0 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  if..    /* EVIDE
176f0 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d  NCE-OF: R-15465-
17700 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75  20813 The maximu
17710 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d  m and minimum em
17720 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20  bedded payload. 
17730 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20     ** fractions 
17740 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79  and the leaf pay
17750 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61  load fraction va
17760 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c  lues must be 64,
17770 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20   32, and 32..   
17780 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
17790 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
177a0 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
177b0 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
177c0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
177d0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
177e0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
177f0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
17800 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
17810 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
17820 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
17830 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
17840 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17850 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
17860 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
17870 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
17880 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
17890 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
178a0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
178b0 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
178c0 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
178d0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
178e0 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
178f0 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
17900 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
17910 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
17920 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
17930 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
17940 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
17950 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17960 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54   R-25008-21688 T
17970 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  he size of a pag
17980 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  e is a power of 
17990 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65  two.    ** betwe
179a0 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
179b0 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20   inclusive. */. 
179c0 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
179d0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
179e0 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
179f0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
17a00 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
17a10 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
17a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
17a30 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17a40 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
17a50 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
17a60 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
17a70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17a80 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68  R-59310-51205 Th
17a90 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63  e "reserved spac
17aa0 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31  e" size in the 1
17ab0 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74  -byte.    ** int
17ac0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32  eger at offset 2
17ad0 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  0 is the number 
17ae0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
17af0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  e at the end of.
17b00 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65      ** each page
17b10 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
17b20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20  extensions. .   
17b30 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45   **.    ** EVIDE
17b40 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
17b50 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
17b60 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
17b70 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  egion is.    ** 
17b80 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
17b90 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
17ba0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
17bb0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
17bc0 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  f 20.    ** into
17bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17be0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
17bf0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
17c00 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
17c10 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33  20];.    if( (u3
17c20 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  2)pageSize!=pBt-
17c30 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
17c40 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
17c50 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
17c60 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
17c70 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
17c80 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
17c90 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
17ca0 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
17cb0 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
17cc0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
17cd0 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
17ce0 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
17cf0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
17d00 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
17d10 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
17d20 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
17d30 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
17d40 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
17d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
17d60 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
17d70 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
17d80 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
17d90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
17da0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
17db0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
17dc0 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
17dd0 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
17de0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
17df0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
17e00 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
17e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17e20 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
17e30 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
17e40 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
17e70 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
17e80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17e90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
17ea0 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  ( (pBt->db->flag
17eb0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76  s & SQLITE_Recov
17ec0 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e  eryMode)==0 && n
17ed0 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
17ee0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
17ef0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17f00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
17f10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17f20 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
17f30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
17f40 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
17f50 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
17f60 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
17f70 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
17f80 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
17f90 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
17fa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
17fb0 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
17fc0 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
17fd0 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
17fe0 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
17ff0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
18000 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
18010 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18020 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18040 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
18050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
18060 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
18070 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18080 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
18090 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
180a0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
180b0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
180c0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
180d0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
180e0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
180f0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
18100 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
18110 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
18120 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
18130 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
18140 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
18150 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
18160 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
18170 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
18180 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
18190 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
181a0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
181b0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
181c0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
181d0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
181e0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
181f0 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
18200 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
18210 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
18220 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
18230 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
18240 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
18250 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
18260 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
18270 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
18280 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
18290 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
182a0 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
182b0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
182c0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
182d0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
182e0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
182f0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
18300 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
18310 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
18320 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
18330 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
18340 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
18350 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
18360 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
18370 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
18380 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
18390 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
183a0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
183b0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
183c0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
183d0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
183e0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
183f0 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
18400 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
18410 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18420 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
18430 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
18440 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
18450 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
18460 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
18470 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
18480 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
18490 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
184a0 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
184b0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
184c0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
184d0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
184e0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
184f0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
18500 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
18510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18520 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18530 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
18540 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
18550 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
18560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
18570 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
18580 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18590 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
185a0 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
185b0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
185c0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
185d0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
185e0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
185f0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
18600 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
18610 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
18620 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
18630 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
18640 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
18650 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
18660 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
18670 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
18680 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
18690 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
186a0 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
186b0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
186c0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
186d0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
186e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
186f0 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
18700 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
18710 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
18720 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
18730 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
18740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18750 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
18760 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
18770 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
18780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
18790 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
187a0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
187b0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
187c0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
187d0 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
187e0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
187f0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
18800 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
18810 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
18820 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
18830 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
18840 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
18850 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
18860 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
18870 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
18880 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
18890 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
188a0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
188b0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
188c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
188d0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
188e0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
188f0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
18900 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18910 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
18920 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
18930 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
18940 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
18950 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
18960 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
18970 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
18980 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
18990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
189a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
189b0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
189c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
189d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
189e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
189f0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
18a00 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
18a10 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
18a20 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
18a30 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
18a40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18a50 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
18a60 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
18a70 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
18a80 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
18a90 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74  age1;.    assert
18aa0 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ( pPage1->aData 
18ab0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
18ac0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
18ad0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
18ae0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==1 );.    pBt->
18af0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
18b00 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
18b10 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ll(pPage1);.  }.
18b20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
18b30 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
18b40 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
18b50 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
18b60 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
18b70 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
18b80 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
18b90 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
18ba0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
18bb0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
18bc0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
18bd0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
18be0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
18bf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18c00 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
18c10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18c20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
18c30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
18c40 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
18c50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
18c70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
18c80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
18c90 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
18ca0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
18cb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
18cc0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
18cd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
18ce0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
18cf0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
18d00 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
18d10 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
18d20 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
18d30 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
18d40 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
18d50 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
18d60 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
18d70 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
18d80 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
18d90 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
18da0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
18db0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
18dc0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
18dd0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
18de0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
18df0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
18e00 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
18e10 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
18e20 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
18e30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
18e40 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
18e50 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
18e60 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
18e70 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
18e80 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
18e90 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
18ea0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
18eb0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
18ec0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
18ed0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
18ee0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
18ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18f00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18f10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
18f20 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
18f30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
18f40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
18f50 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
18f60 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
18f70 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
18f80 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
18f90 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
18fa0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
18fb0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
18fc0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
18fd0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
18fe0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
18ff0 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
19000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19010 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
19020 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
19030 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
19040 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
19050 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
19060 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
19070 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
19080 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
19090 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
190a0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
190b0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
190c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
190d0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
190e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
190f0 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
19100 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
19110 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19120 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
19130 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
19140 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
19150 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
19160 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19180 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
19190 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
191a0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
191b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
191c0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
191d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
191e0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
191f0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
19200 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
19210 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19220 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
19230 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
19240 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
19250 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
19260 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
19270 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
19280 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
19290 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
192a0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
192b0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
192c0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
192d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
192e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
192f0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
19300 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
19310 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
19320 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
19330 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
19340 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
19350 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
19360 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
19370 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
19380 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
19390 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
193a0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
193b0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
193c0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
193d0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
193e0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
193f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
19400 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
19410 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
19420 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
19430 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
19440 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
19450 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
19460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
19470 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
19480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
19490 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
194a0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
194b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
194c0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
194d0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
194e0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
194f0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
19500 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
19510 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
19520 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
19530 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
19540 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
19550 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
19560 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
19570 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
19580 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
19590 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
195a0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
195b0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
195c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
195d0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
195e0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
195f0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
19600 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
19610 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
19620 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
19630 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
19640 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
19650 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
19660 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
19670 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
19680 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
19690 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
196a0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
196b0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
196c0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
196d0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
196e0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
196f0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
19700 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
19710 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
19720 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
19730 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
19740 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
19750 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
19760 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
19770 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
19780 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
19790 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
197a0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
197b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
197c0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
197d0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
197e0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
197f0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
19800 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
19810 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19820 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
19830 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
19840 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
19850 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
19860 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19870 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
19880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
19890 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
198a0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
198b0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
198c0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
198d0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
198e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
198f0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
19900 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
19910 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
19920 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
19930 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
19940 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
19950 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
19960 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
19970 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
19980 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19990 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
199a0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
199b0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
199c0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
199d0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
199e0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
199f0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
19a00 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
19a10 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
19a20 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
19a30 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
19a40 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
19a50 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
19a60 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
19a70 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
19a80 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
19a90 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
19aa0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
19ab0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
19ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19ad0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
19ae0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
19af0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19b00 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
19b10 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
19b20 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
19b30 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
19b40 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
19b50 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
19b60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
19b70 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
19b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
19b90 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
19ba0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
19bb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
19bc0 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c  RANS_WRITE).   |
19bd0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
19be0 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
19bf0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f  =0.  ){.    pBlo
19c00 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
19c10 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
19c20 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
19c30 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
19c40 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
19c50 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
19c60 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
19c70 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
19c80 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
19c90 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
19ca0 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
19cb0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
19cc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19ce0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
19cf0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
19d00 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
19d10 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
19d20 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
19d30 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
19d40 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
19d50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
19d60 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
19d70 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
19d80 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
19d90 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
19da0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
19db0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
19dc0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
19dd0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
19de0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
19df0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
19e00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19e10 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
19e20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
19e30 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
19e40 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
19e50 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
19e60 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
19e70 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
19e80 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
19e90 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
19ea0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
19eb0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
19ec0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
19ed0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
19ee0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
19ef0 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
19f00 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
19f10 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
19f20 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
19f30 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
19f40 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
19f50 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
19f60 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
19f70 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
19f80 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
19f90 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
19fa0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
19fb0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
19fc0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
19fd0 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
19fe0 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
19ff0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1a000 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1a010 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1a020 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1a030 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1a040 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1a050 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1a060 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1a070 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1a080 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1a090 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1a0a0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1a0b0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1a0c0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1a0d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1a0e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1a0f0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1a100 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1a110 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1a120 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1a130 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1a140 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1a150 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a160 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1a170 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1a180 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1a190 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1a1a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1a1b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a1c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1a1d0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1a1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a1f0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1a200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a210 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1a220 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1a230 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1a240 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1a250 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1a260 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a270 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1a280 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1a290 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1a2a0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1a2b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a2c0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1a2d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1a2e0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1a2f0 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1a300 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a310 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1a320 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1a330 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1a340 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1a350 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1a360 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1a370 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1a380 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1a390 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1a3a0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1a3b0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1a3c0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1a3d0 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1a3e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1a3f0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1a400 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1a410 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1a420 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1a430 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1a440 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1a450 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a460 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1a470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1a480 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1a490 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1a4a0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1a4b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a4c0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1a4d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1a4e0 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1a4f0 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1a500 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1a510 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1a520 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1a530 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1a540 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1a550 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1a560 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1a570 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1a580 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1a590 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1a5a0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1a5b0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1a5c0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1a5d0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1a5e0 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1a5f0 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1a600 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1a610 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1a620 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1a630 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1a640 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1a650 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1a660 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1a670 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1a680 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1a690 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1a6a0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1a6b0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1a6c0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1a6d0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1a6e0 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1a6f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1a700 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1a710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1a720 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1a730 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1a740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1a760 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1a770 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1a780 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7a0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1a7b0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1a7c0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1a7d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1a7e0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1a7f0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1a800 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1a810 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1a820 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1a830 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1a840 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1a850 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1a860 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1a870 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1a880 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1a890 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1a8a0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1a8b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a8c0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1a8d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1a8e0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1a8f0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1a900 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1a910 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a920 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1a930 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a940 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a950 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1a960 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1a970 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1a980 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1a990 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1a9a0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1a9b0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1a9c0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1a9d0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1a9e0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1a9f0 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1aa00 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1aa10 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1aa20 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1aa30 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1aa40 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1aa70 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1aa80 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1aab0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1aac0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1aad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aaf0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1ab00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ab10 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
1ab20 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1ab30 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1ab40 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1ab50 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1ab60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ab70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1ab80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1ab90 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1aba0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1abb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1abc0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
1abd0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
1abe0 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
1abf0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1ac00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1ac10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1ac20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1ac30 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1ac40 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1ac50 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1ac60 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1ac70 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1ac80 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1ac90 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1aca0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1acb0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1acc0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1acd0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1ace0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1acf0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1ad00 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1ad10 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1ad20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1ad30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1ad40 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1ad50 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1ad60 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1ad70 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1ad80 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
1ad90 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
1ada0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1adb0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
1adc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1add0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1ade0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1adf0 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1ae00 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1ae10 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1ae20 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1ae30 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1ae40 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1ae50 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1ae60 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1ae70 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1ae80 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1ae90 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1aea0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1aeb0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1aec0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1aee0 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1aef0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1af00 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1af10 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1af20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1af30 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1af60 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1af70 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1af80 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1af90 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1afa0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1afb0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1afc0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1afd0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1afe0 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1aff0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1b000 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b010 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1b020 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1b030 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1b040 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1b050 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1b060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b070 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1b080 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1b090 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1b0a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1b0b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1b0c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1b0d0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1b0e0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1b0f0 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1b100 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1b110 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1b120 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1b130 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1b140 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1b150 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b170 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1b180 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1b190 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1b1a0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
1b1b0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1b1c0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
1b1d0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1b1e0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1b1f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
1b200 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1b210 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1b220 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1b230 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1b240 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b250 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1b260 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1b270 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1b280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1b290 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1b2a0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1b2b0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1b2c0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1b2d0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1b2e0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1b2f0 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1b300 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20  iOverflow.      
1b310 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f     && pCell+info
1b320 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50  .iOverflow+3<=pP
1b330 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1b340 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20  ->maskPage.     
1b350 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65      && iFrom==ge
1b360 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
1b370 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20  fo.iOverflow]). 
1b380 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1b390 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
1b3a0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1b3b0 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
1b3c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b3d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1b3e0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1b3f0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1b400 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1b410 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1b420 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1b430 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b440 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b450 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1b460 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1b470 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1b480 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1b490 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1b4a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b4b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b4c0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1b4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b4e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1b4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1b500 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1b510 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1b520 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1b530 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
1b540 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1b550 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
1b560 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b570 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1b580 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1b590 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1b5a0 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1b5b0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1b5c0 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1b5d0 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1b5e0 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1b5f0 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1b600 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1b610 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1b620 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1b630 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1b640 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1b650 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1b660 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1b670 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1b680 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1b690 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1b6a0 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1b6b0 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1b6c0 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1b6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1b6e0 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1b6f0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1b700 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1b710 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1b720 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1b730 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1b740 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1b750 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1b760 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1b770 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1b780 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1b790 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1b7a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1b7b0 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1b7c0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1b7d0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1b7e0 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1b7f0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1b800 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1b810 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1b820 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1b830 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1b840 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1b850 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1b860 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1b870 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1b880 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1b890 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1b8a0 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1b8b0 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1b8c0 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1b8d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1b8e0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1b8f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1b900 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1b910 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1b920 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1b930 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1b940 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1b950 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1b960 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1b970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b980 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b990 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1b9a0 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1b9b0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1b9c0 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1b9d0 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1b9e0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1b9f0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1ba00 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1ba10 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1ba20 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1ba30 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1ba40 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1ba50 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1ba60 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1ba70 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1ba80 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1ba90 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1baa0 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1bab0 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1bac0 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1bad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1baf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1bb00 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1bb10 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1bb20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1bb30 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1bb40 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1bb50 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1bb60 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1bb70 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1bb80 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1bb90 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1bba0 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1bbb0 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1bbc0 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1bbd0 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1bbe0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1bbf0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1bc00 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1bc10 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1bc20 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1bc30 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1bc40 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1bc50 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1bc60 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1bc70 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1bc80 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1bc90 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1bca0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1bcb0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1bcc0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1bcd0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1bce0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1bcf0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1bd00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1bd10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bd20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1bd30 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1bd40 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1bd50 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1bd60 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1bd70 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1bd80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1bd90 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1bda0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1bdb0 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1bdc0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1bdd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bde0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1bdf0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1be00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1be10 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1be20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1be30 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1be40 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1be50 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1be60 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1be70 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1be80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1be90 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1bea0 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1beb0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1bec0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1bed0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1bee0 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1bef0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
1bf00 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1bf10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bf20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1bf30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bf40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1bf50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1bf60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bf70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1bf80 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1bf90 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1bfa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1bfb0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
1bfc0 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
1bfd0 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
1bfe0 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
1bff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1c000 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1c010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c020 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1c030 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
1c040 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1c050 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
1c060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c070 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1c080 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
1c090 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
1c0a0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
1c0b0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1c0c0 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
1c0d0 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
1c0e0 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
1c0f0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
1c100 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
1c110 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
1c120 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
1c130 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
1c140 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
1c150 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
1c160 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
1c170 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
1c180 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
1c190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1c1a0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
1c1b0 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
1c1c0 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
1c1d0 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
1c1e0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1c1f0 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
1c200 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
1c210 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1c220 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
1c230 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1c240 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
1c250 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
1c260 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
1c270 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
1c280 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
1c290 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
1c2a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1c2b0 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
1c2c0 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
1c2d0 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
1c2e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1c2f0 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
1c300 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1c310 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1c320 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
1c330 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1c340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
1c350 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
1c360 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
1c370 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
1c380 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
1c390 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1c3a0 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
1c3b0 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
1c3c0 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
1c3d0 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1c3e0 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
1c3f0 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
1c400 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
1c410 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1c420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1c430 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
1c440 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1c450 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
1c460 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
1c470 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
1c480 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1c490 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1c4a0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
1c4b0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
1c4c0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1c4d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c4e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1c500 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
1c510 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
1c520 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1c530 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
1c540 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1c550 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
1c560 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
1c570 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
1c580 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
1c590 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c5a0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1c5b0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
1c5c0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1c5d0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
1c5e0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
1c5f0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
1c600 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
1c610 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
1c620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c630 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c640 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1c650 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c660 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1c670 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c680 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c690 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
1c6a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1c6b0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
1c6c0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1c6d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
1c6e0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
1c6f0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
1c700 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
1c710 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
1c720 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
1c730 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
1c740 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
1c750 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
1c760 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
1c770 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
1c780 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1c790 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
1c7a0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
1c7b0 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
1c7c0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
1c7d0 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
1c7e0 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
1c7f0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1c800 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1c810 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1c820 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1c830 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1c840 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1c850 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
1c860 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
1c870 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1c880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c890 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c8a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1c8b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1c8c0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
1c8d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1c8e0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1c8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1c900 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
1c910 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
1c920 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1c930 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
1c940 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
1c950 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
1c960 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
1c970 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
1c980 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
1c990 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
1c9a0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1c9b0 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
1c9c0 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
1c9d0 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
1c9e0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1c9f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1ca00 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
1ca10 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1ca20 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
1ca30 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
1ca40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ca50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1ca60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1ca70 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
1ca80 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
1ca90 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
1caa0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
1cab0 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
1cac0 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
1cad0 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
1cae0 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
1caf0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
1cb00 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
1cb10 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
1cb20 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
1cb30 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
1cb40 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
1cb50 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
1cb60 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
1cb70 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
1cb80 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
1cb90 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
1cba0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1cbb0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
1cbc0 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
1cbd0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1cbe0 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
1cbf0 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
1cc00 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
1cc10 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
1cc20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1cc30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1cc40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1cc50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1cc60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1cc70 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
1cc80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1cc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cca0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1ccb0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1ccc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ccd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cce0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ccf0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1cd00 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
1cd10 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
1cd20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cd30 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
1cd40 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
1cd50 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
1cd60 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
1cd70 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1cd80 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
1cd90 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
1cda0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1cdb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1cdc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cdd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1cde0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cdf0 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
1ce00 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
1ce10 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
1ce20 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
1ce30 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
1ce40 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
1ce50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1ce60 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
1ce70 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ce80 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
1ce90 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
1cea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ceb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cec0 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
1ced0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
1cee0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1cef0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1cf00 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
1cf10 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
1cf20 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
1cf30 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
1cf40 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
1cf50 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1cf60 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1cf70 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
1cf80 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
1cf90 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1cfa0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
1cfb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1cfc0 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
1cfd0 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
1cfe0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
1cff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d000 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1d010 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1d020 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1d030 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1d040 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d050 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1d060 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1d070 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1d0a0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1d0b0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1d0c0 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1d0d0 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1d0e0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1d0f0 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1d100 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1d110 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1d120 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1d130 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1d140 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1d150 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1d160 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1d170 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1d180 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1d190 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1d1a0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1d1b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1d1c0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1d1d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1d1e0 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1d1f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1d200 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1d210 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1d220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1d230 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1d240 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1d250 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1d260 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1d270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1d280 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1d290 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1d2a0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1d2b0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1d2c0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1d2d0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1d2e0 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1d2f0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1d300 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1d310 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1d320 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1d330 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1d340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d350 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1d360 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1d370 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1d380 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1d390 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d3a0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1d3b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d3c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1d3d0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1d3e0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1d3f0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1d400 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1d410 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d420 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1d430 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1d440 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1d450 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1d460 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d470 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1d480 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1d490 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1d4a0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1d4b0 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1d4c0 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1d4d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1d4e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1d4f0 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1d500 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1d510 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1d520 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1d530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d540 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1d550 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1d560 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1d570 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1d580 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1d590 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1d5a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1d5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d5c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d5d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1d5e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1d5f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1d600 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1d610 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1d620 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1d630 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1d640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d650 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1d660 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1d670 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1d680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d690 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1d6a0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1d6b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1d6c0 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1d6d0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1d6e0 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1d6f0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1d700 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1d710 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d720 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1d730 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1d740 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1d750 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1d760 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1d770 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1d780 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1d790 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1d7a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1d7b0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1d7c0 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1d7d0 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1d7e0 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1d7f0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1d800 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1d810 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1d820 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1d830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1d840 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1d850 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1d860 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1d870 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1d880 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1d890 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d8a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d8b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d8c0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1d8d0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1d8e0 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1d8f0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1d900 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1d910 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1d920 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1d930 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1d940 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1d950 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1d960 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1d970 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1d980 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1d990 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1d9a0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1d9b0 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1d9c0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1d9d0 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1d9e0 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1d9f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1da00 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1da10 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1da20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1da30 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1da40 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1da50 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1da60 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1da70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1da80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1da90 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1daa0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1dab0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1dac0 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1dad0 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1dae0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1daf0 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1db00 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1db10 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1db20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1db30 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1db40 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1db50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1db60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1db70 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1db80 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1db90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1dba0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1dbb0 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1dbc0 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1dbd0 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1dbe0 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1dbf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1dc00 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1dc10 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1dc20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1dc30 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1dc40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1dc50 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1dc60 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1dc70 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1dc80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1dc90 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1dca0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1dcb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1dcc0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1dcd0 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1dce0 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1dcf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1dd00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dd10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1dd20 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1dd30 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1dd40 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1dd50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1dd60 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1dd70 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1dd80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1dd90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1dda0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1ddb0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1ddc0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1ddd0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1dde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ddf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1de00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1de10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1de20 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1de30 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1de40 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1de50 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1de60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1de70 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1de80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1de90 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1dea0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1deb0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1dec0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ded0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1dee0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1def0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1df00 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1df10 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1df20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1df30 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1df40 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1df50 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1df60 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1df70 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1df80 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1df90 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1dfa0 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1dfb0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1dfc0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1dfd0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1dfe0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1dff0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1e000 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1e010 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1e020 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1e030 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1e040 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1e050 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1e060 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1e070 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1e080 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1e090 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1e0a0 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1e0b0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1e0c0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1e0d0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1e0e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1e0f0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1e100 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1e110 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1e120 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1e130 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1e140 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1e150 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1e160 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1e170 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1e180 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1e190 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1e1a0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1e1b0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1e1c0 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1e1d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1e1e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1e1f0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1e200 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1e210 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e220 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1e230 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1e240 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1e250 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1e260 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1e270 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1e280 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1e290 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1e2a0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1e2b0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1e2c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1e2d0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1e2e0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1e2f0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1e300 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1e310 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1e320 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1e330 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1e340 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1e350 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1e360 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1e370 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1e380 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1e390 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1e3a0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1e3b0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1e3c0 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1e3d0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1e3e0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1e3f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e400 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1e410 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1e420 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1e430 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1e440 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1e450 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1e460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e470 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1e480 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1e490 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1e4a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1e4b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e4c0 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1e4d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e4e0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1e4f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1e500 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1e510 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1e520 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e540 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1e550 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1e560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e570 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e580 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1e590 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1e5a0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1e5b0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1e5c0 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1e5d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1e5e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e5f0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1e600 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1e610 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1e620 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1e630 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1e640 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e650 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e660 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1e670 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1e680 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1e690 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1e6a0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1e6b0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1e6c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1e6d0 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1e6e0 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1e6f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1e700 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1e710 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1e720 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1e730 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1e740 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1e750 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e760 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1e770 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1e780 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1e790 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1e7a0 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1e7b0 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1e7c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1e7d0 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1e7e0 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1e7f0 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1e800 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1e810 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1e820 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1e830 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1e840 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1e850 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1e860 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1e870 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1e880 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1e890 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1e8a0 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1e8b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1e8c0 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1e8d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1e8e0 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1e8f0 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1e900 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1e910 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1e920 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1e930 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1e940 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1e950 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1e960 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1e970 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1e980 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1e990 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1e9a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1e9b0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1e9c0 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1e9d0 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1e9e0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1e9f0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1ea00 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1ea10 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1ea20 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1ea30 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1ea40 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1ea50 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1ea60 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1ea70 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1ea80 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1ea90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1eaa0 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1eab0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1eac0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1ead0 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1eae0 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1eaf0 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1eb00 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1eb10 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1eb20 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1eb30 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1eb40 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1eb50 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1eb60 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1eb70 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1eb90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1eba0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1ebb0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1ebc0 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1ebd0 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1ebe0 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1ebf0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1ec00 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1ec10 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1ec20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1ec30 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1ec40 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1ec50 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1ec60 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1ec70 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1ec80 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1ec90 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1eca0 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1ecb0 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1ecc0 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1ecd0 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1ece0 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1ecf0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1ed00 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1ed10 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1ed20 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1ed30 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1ed40 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1ed50 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1ed60 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1ed70 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1ed80 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1ed90 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1eda0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1edb0 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1edc0 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1edd0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1ede0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1edf0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1ee00 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1ee10 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1ee20 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1ee30 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1ee40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1ee50 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1ee60 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1ee70 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1ee80 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1ee90 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1eea0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1eeb0 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1eec0 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1eed0 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1eee0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1eef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1ef00 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1ef10 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1ef20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1ef30 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1ef40 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1ef50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1ef60 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1ef70 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1ef80 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1ef90 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1efa0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1efb0 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1efc0 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1efd0 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1efe0 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1eff0 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1f000 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1f010 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1f020 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1f030 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1f040 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1f050 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1f060 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1f070 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1f080 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1f090 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1f0a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1f0b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1f0c0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1f0d0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1f0e0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1f0f0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1f100 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f110 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1f120 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1f130 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1f140 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1f150 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1f160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1f170 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f180 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1f190 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1f1a0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1f1b0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1f1c0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1f1d0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1f1e0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1f1f0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1f200 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1f210 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1f220 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1f230 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f240 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1f250 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1f260 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1f270 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1f280 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1f290 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1f2a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1f2b0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1f2c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f2d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1f2e0 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1f2f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f300 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1f310 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1f320 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f330 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1f340 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f350 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
1f360 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
1f370 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
1f380 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
1f390 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1f3a0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1f3b0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1f3c0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1f3d0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f3e0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1f3f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1f400 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1f410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f420 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1f430 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1f440 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1f450 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1f460 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1f470 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1f480 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1f490 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1f4a0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1f4b0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1f4c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f4e0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f4f0 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
1f500 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f510 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1f520 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1f530 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1f540 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1f550 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1f560 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1f570 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1f580 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
1f590 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1f5a0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1f5b0 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
1f5c0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
1f5d0 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
1f5e0 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
1f5f0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
1f600 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
1f610 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
1f620 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
1f630 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
1f640 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
1f650 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
1f660 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1f670 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
1f680 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1f690 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
1f6a0 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
1f6b0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
1f6c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f6d0 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
1f6e0 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
1f6f0 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
1f700 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
1f710 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
1f720 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
1f730 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
1f740 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
1f750 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
1f760 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
1f770 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
1f780 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
1f790 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
1f7a0 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
1f7b0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
1f7c0 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
1f7d0 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
1f7e0 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
1f7f0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
1f800 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
1f810 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
1f820 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
1f830 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1f840 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
1f850 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
1f860 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
1f870 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
1f880 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f890 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
1f8a0 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
1f8b0 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
1f8c0 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
1f8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
1f8e0 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
1f8f0 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
1f900 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1f910 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
1f920 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
1f930 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
1f940 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
1f950 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
1f960 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
1f970 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
1f980 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
1f990 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f9a0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
1f9b0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
1f9c0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
1f9d0 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
1f9e0 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
1f9f0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1fa00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fa10 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1fa20 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1fa30 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
1fa40 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
1fa50 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1fa60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fa70 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
1fa80 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
1fa90 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
1faa0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
1fab0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
1fac0 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
1fad0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1fae0 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
1faf0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1fb00 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1fb10 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
1fb20 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
1fb30 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
1fb40 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
1fb50 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
1fb60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
1fb70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fb80 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
1fb90 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
1fba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1fbb0 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
1fbc0 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
1fbd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fbe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fbf0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
1fc00 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1fc10 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
1fc20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
1fc30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1fc40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1fc50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fc60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1fc70 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
1fc80 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
1fc90 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1fca0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
1fcb0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1fcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
1fcd0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1fce0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1fcf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1fd00 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1fd10 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1fd20 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
1fd30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fd40 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1fd50 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1fd60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
1fd70 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1fd80 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1fd90 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
1fda0 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
1fdb0 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
1fdc0 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
1fdd0 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
1fde0 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
1fdf0 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
1fe00 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
1fe10 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
1fe20 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
1fe30 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
1fe40 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
1fe50 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1fe60 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
1fe70 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
1fe80 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
1fe90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1fea0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1feb0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1fec0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1fed0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1fee0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1fef0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1ff00 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1ff10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ff20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1ff30 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
1ff40 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
1ff50 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1ff60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ff70 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
1ff80 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
1ff90 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
1ffa0 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
1ffb0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
1ffc0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
1ffd0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
1ffe0 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
1fff0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
20000 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20010 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
20020 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
20030 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
20040 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
20050 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20060 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
20070 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
20080 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
20090 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
200a0 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
200b0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
200c0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
200d0 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
200e0 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
200f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20100 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
20110 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
20120 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
20130 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20140 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20150 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
20160 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
20170 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20180 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
20190 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
201a0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
201b0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
201c0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
201d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
201e0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
201f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20200 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20210 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20220 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
20230 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
20240 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
20250 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
20260 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
20270 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
20280 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
20290 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
202a0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
202b0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
202c0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
202d0 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
202e0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
202f0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
20300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
20310 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
20320 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
20330 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
20340 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
20350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
20360 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
20370 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20380 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
20390 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
203a0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
203b0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
203c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
203d0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
203e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
203f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20400 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
20410 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
20420 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
20430 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20440 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20450 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20460 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20470 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20480 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20490 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
204a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
204b0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
204c0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
204d0 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
204e0 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
204f0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
20500 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
20510 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
20520 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
20530 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
20540 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
20550 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
20560 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
20570 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
20580 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
20590 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
205a0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
205b0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
205c0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
205d0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
205e0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
205f0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
20600 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
20610 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
20620 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
20630 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
20640 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
20650 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
20660 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
20670 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
20680 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
20690 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
206a0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
206b0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
206c0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
206d0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
206e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
206f0 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
20700 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
20710 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
20720 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
20730 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
20740 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
20750 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
20760 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
20770 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
20780 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
20790 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
207a0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
207b0 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
207c0 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
207d0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
207e0 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
207f0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
20800 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
20810 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
20820 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
20830 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20840 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
20850 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
20860 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
20870 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
20880 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
20890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
208a0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
208b0 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
208c0 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
208d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
208e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
208f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
20910 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20920 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
20930 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
20940 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
20950 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
20960 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
20970 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
20980 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
20990 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
209a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
209b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
209c0 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
209d0 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
209e0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
209f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
20a00 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
20a10 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
20a20 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
20a30 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
20a40 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
20a50 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
20a60 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
20a70 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
20a80 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
20a90 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
20aa0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
20ab0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
20ac0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
20ad0 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
20ae0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
20af0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
20b00 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
20b10 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
20b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20b30 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20b40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
20b50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20b60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20b70 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
20b80 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
20b90 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
20ba0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
20bb0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
20bc0 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
20bd0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
20be0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
20bf0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
20c00 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
20c10 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
20c20 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
20c30 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
20c40 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
20c50 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
20c60 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
20c70 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
20c80 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
20c90 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
20ca0 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
20cb0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
20cc0 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
20cd0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
20ce0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
20cf0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
20d00 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
20d10 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
20d20 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
20d30 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
20d40 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
20d50 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
20d60 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
20d70 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
20d80 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
20d90 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
20da0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
20db0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
20dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
20dd0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
20de0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20df0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
20e00 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20e10 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
20e20 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
20e30 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
20e40 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
20e50 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
20e60 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
20e70 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
20e80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
20e90 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
20ea0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
20eb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20ec0 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
20ed0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
20ee0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
20ef0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
20f10 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
20f20 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
20f30 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
20f40 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
20f50 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20f70 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
20f80 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
20f90 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
20fa0 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
20fb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
20fc0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
20fd0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
20fe0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
20ff0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
21000 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
21010 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
21020 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
21030 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
21040 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
21050 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
21060 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
21070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21080 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
21090 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
210a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
210b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
210c0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
210d0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
210e0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
210f0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
21100 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
21110 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
21120 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
21130 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
21140 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
21150 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
21160 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
21170 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21180 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
21190 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
211a0 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
211b0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
211c0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
211d0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
211e0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
211f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21200 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
21210 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
21220 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
21230 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21240 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
21250 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
21260 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
21270 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
21280 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
21290 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
212a0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
212b0 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
212c0 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
212d0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
212e0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
212f0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
21300 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
21310 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
21320 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
21330 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
21340 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
21350 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
21360 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21370 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
21380 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
21390 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
213a0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
213b0 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
213c0 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
213d0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
213e0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
213f0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
21400 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
21410 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
21420 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
21430 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
21440 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
21450 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
21460 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
21470 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
21480 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21490 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
214a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
214b0 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
214c0 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
214d0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
214e0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
214f0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
21500 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
21510 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
21520 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
21530 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
21540 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
21550 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
21560 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
21570 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
21580 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
21590 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
215a0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
215b0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
215c0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
215d0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
215e0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
215f0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
21600 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
21610 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
21620 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
21630 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
21640 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
21650 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21680 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
21690 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
216c0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
216d0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
216e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21700 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
21710 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
21720 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
21730 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
21740 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
21750 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
21760 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
21770 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
217a0 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
217b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
217c0 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
217d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
217e0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
217f0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
21800 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
21810 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
21820 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
21830 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
21840 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
21850 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
21860 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
21870 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
21880 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
21890 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
218a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
218b0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
218c0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
218d0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
218e0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
218f0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
21900 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
21910 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
21920 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
21930 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
21940 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
21950 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
21960 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
21970 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
21980 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
21990 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
219a0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
219b0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
219c0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
219d0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
219e0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
219f0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
21a00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
21a10 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
21a20 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
21a30 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
21a40 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
21a50 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
21a60 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
21a70 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
21a80 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
21a90 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
21aa0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
21ab0 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  Y)!=0) ){.    re
21ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
21ad0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
21ae0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
21af0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
21b00 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
21b10 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
21b20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21b30 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
21b40 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
21b50 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
21b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
21b70 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
21b80 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
21b90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
21ba0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
21bb0 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
21bc0 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
21bd0 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
21be0 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
21bf0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
21c00 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
21c10 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
21c20 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
21c30 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
21c40 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
21c50 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
21c60 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
21c70 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
21c80 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
21c90 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20   pBt;.  assert( 
21ca0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
21cb0 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46  lag==BTCF_WriteF
21cc0 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63  lag );.  pCur->c
21cd0 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
21ce0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
21cf0 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
21d00 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
21d10 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 70 43 75  _READONLY;.  pCu
21d20 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
21d30 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
21d40 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
21d50 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
21d60 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
21d70 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
21d80 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
21d90 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
21da0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
21db0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
21dc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21dd0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
21de0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
21e10 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
21e20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
21e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e40 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
21e50 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
21e60 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
21e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
21ea0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
21eb0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
21ec0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21ee0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
21ef0 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
21f00 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21f30 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
21f40 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
21f50 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
21f60 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
21f70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21f80 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
21f90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21fa0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
21fb0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
21fc0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
21fd0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
21fe0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21ff0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
22000 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22010 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
22020 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
22030 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
22040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
22050 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
22060 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
22070 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
22080 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
22090 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
220a0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
220b0 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
220c0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
220d0 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
220e0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
220f0 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
22100 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
22110 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
22120 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
22130 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22140 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
22150 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
22160 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
22170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
22180 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
22190 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
221a0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
221b0 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
221c0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
221d0 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
221e0 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
221f0 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
22200 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
22210 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
22220 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
22230 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
22240 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
22250 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
22260 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
22270 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
22280 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
22290 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
222a0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
222b0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
222c0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
222d0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
222e0 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
222f0 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
22300 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
22310 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
22320 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
22330 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
22340 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
22350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22360 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
22370 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
22380 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
22390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
223a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
223b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
223c0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
223d0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
223e0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
223f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
22400 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
22410 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
22420 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22430 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
22440 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
22450 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
22460 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
22470 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
22480 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
22490 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
224a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
224b0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
224c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
224d0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
224e0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
224f0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
22500 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
22510 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
22520 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
22530 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
22540 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
22550 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
22560 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
22570 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
22580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
22590 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
225a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
225b0 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
225c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
225d0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
225e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
225f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
22600 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
22610 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
22620 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
22630 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
22640 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
22650 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
22660 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
22670 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
22680 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
22690 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
226a0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
226b0 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
226c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
226d0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
226e0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
226f0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
22700 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
22710 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
22720 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
22730 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
22740 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
22750 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
22760 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
22770 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
22780 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
22790 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
227a0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
227b0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
227c0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
227d0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
227e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
227f0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
22800 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
22810 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
22820 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
22830 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
22840 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
22850 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
22860 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
22870 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  if.static SQLITE
22880 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67  _NOINLINE void g
22890 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
228a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66  sor *pCur){.  if
228b0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
228c0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ze==0 ){.    int
228d0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
228e0 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Page;.    pCur->
228f0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22900 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
22910 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
22920 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
22930 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
22940 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
22950 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
22960 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
22970 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
22980 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
22990 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
229a0 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
229b0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
229c0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
229d0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
229e0 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
229f0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
22a00 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
22a10 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
22a20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
22a30 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
22a40 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
22a50 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
22a60 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
22a70 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
22a80 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
22a90 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
22aa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22ab0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
22ac0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
22ad0 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
22ae0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22af0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
22b00 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
22b10 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
22b20 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
22b30 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
22b40 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
22b50 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
22b60 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
22b70 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
22b80 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
22b90 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
22ba0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
22bb0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
22bc0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
22bd0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
22be0 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
22bf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22c00 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
22c10 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
22c20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22c30 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a   in the key..**.
22c40 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
22c50 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  st position the 
22c60 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20  cursor prior to 
22c70 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
22c80 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  utine..** .** Th
22c90 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
22ca0 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61  t fail.  It alwa
22cb0 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
22cc0 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  E_OK.  .*/.int s
22cd0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
22ce0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
22cf0 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
22d00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22d10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22d30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22d40 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
22d50 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
22d60 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
22d70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72  ->info.nKey;.  r
22d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
22da0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
22db0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
22dc0 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
22dd0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
22de0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
22df0 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  to..**.** The ca
22e00 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e  ller must guaran
22e10 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72  tee that the cur
22e20 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
22e30 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  to a non-NULL.**
22e40 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49   valid entry.  I
22e50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
22e60 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
22e70 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e  dure must guaran
22e80 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  tee.** that the 
22e90 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f  cursor has Curso
22ea0 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  r.eState==CURSOR
22eb0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61  _VALID..**.** Fa
22ec0 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
22ed0 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e  sible.  This fun
22ee0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74  ction always ret
22ef0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
22f00 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74  ** It might just
22f10 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72   as well be a pr
22f20 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69  ocedure (returni
22f30 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20  ng void) but we 
22f40 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72  continue.** to r
22f50 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
22f60 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   result code for
22f70 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73   historical reas
22f80 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
22f90 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
22fa0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22fb0 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
22fc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22fd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22ff0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23000 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23010 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23020 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23030 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23040 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23060 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23070 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
23080 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
23090 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
230a0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
230b0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
230c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
230d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
230e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
230f0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
23100 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
23110 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
23120 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
23130 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
23140 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23150 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
23160 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
23170 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
23180 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
23190 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
231a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
231b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
231c0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
231d0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
231e0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
231f0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
23200 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
23210 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23220 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23230 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
23240 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
23250 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
23260 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
23270 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
23280 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
23290 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
232a0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
232b0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
232c0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
232d0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
232e0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
232f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
23300 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
23310 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
23320 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
23330 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
23340 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
23350 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
23360 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
23370 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
23380 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
23390 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
233a0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
233b0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
233c0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
233d0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
233e0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
233f0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
23400 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
23410 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
23420 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
23430 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
23440 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
23450 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
23460 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
23470 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
23480 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
23490 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
234a0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
234b0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
234c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
234d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
234e0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
234f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
23500 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
23510 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
23520 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
23530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23540 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
23550 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
23560 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
23570 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
23580 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
23590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
235a0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
235b0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
235c0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
235d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
235e0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
235f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23600 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
23610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
23620 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
23630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23640 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
23650 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
23660 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
23670 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
23680 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
23690 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
236a0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
236b0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
236c0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
236d0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
236e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
236f0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
23700 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
23710 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
23720 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
23730 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
23740 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
23750 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
23760 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
23770 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
23780 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
23790 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
237a0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
237b0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
237c0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
237d0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
237e0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
237f0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
23800 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
23810 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
23820 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
23830 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
23840 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
23850 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
23860 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
23870 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
23880 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
23890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
238a0 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
238b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
238c0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
238d0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
238e0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
238f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
23900 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
23910 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
23920 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
23930 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
23940 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
23950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23960 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
23970 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
23980 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
23990 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
239a0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
239b0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
239c0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
239d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
239e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
239f0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
23a00 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
23a10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
23a20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
23a30 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
23a40 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
23a50 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
23a60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
23a70 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
23a80 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
23a90 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
23aa0 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
23ab0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
23ac0 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
23ad0 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
23ae0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
23af0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
23b00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
23b10 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
23b20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
23b30 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
23b40 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
23b50 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
23b60 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
23b70 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
23b80 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
23b90 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
23ba0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
23bb0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
23bc0 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
23bd0 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
23be0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
23bf0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
23c00 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
23c10 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
23c20 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
23c30 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
23c40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
23c50 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
23c60 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
23c70 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
23c80 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
23c90 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
23ca0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
23cb0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
23cc0 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
23cd0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
23ce0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
23cf0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
23d00 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
23d10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23d20 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
23d30 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
23d60 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
23d70 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
23d80 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
23d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
23da0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
23db0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
23dc0 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
23dd0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
23de0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
23df0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
23e00 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
23e10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23e20 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
23e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
23e50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23e60 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
23e70 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
23e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
23e90 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
23ea0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
23eb0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
23ec0 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
23ed0 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
23ee0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
23ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23f00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
23f10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
23f20 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
23f30 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
23f40 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
23f50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
23f60 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
23f70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
23f80 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
23f90 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
23fa0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
23fb0 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
23fc0 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
23fd0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
23fe0 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
23ff0 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
24000 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
24010 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
24020 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
24030 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
24040 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
24050 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
24060 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24070 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
24080 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
24090 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
240a0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
240b0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
240c0 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
240d0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
240e0 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
240f0 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
24100 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
24110 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
24120 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
24130 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
24140 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
24150 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
24160 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
24170 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
24180 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
24190 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
241a0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
241b0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
241c0 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
241d0 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
241e0 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
241f0 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
24200 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
24210 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
24220 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
24230 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
24240 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
24250 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
24260 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
24270 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
24280 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
24290 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
242a0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
242b0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
242c0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
242d0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
242e0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
242f0 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
24300 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
24310 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
24320 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
24330 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
24340 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
24350 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
24360 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
24370 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
24380 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
24390 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
243a0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
243b0 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
243c0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
243d0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
243e0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
243f0 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
24400 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
24410 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
24420 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
24430 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
24440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
24450 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
24460 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
24470 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
24480 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
24490 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
244a0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
244b0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
244c0 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
244d0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
244e0 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
244f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
24500 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
24510 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
24520 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
24530 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
24540 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
24550 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
24560 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
24570 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
24580 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
24590 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
245a0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
245b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
245c0 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
245d0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
245e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
245f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24600 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
24610 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
24620 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
24630 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
24660 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
24670 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
24680 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
24690 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
246a0 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
246b0 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
246c0 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
246f0 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
24700 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
24710 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
24720 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
24730 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24740 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24750 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
24760 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24770 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
24780 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
24790 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
247a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
247b0 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
247c0 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
247d0 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
247e0 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
247f0 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
24800 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
24810 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
24820 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
24830 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
24840 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24850 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
24860 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
24870 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
24880 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
24890 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
248a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
248b0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
248c0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
248d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
248e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
248f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
24900 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
24910 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
24920 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
24930 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
24940 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
24950 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24960 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
24970 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
24980 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
24990 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
249a0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
249b0 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
249c0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
249d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
249e0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
249f0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
24a00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
24a10 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
24a20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
24a30 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
24a40 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
24a50 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
24a60 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
24a70 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
24a80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
24a90 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
24aa0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
24ab0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
24ac0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
24ad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
24ae0 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
24af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24b00 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
24b10 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
24b20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
24b30 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
24b40 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
24b50 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
24b60 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
24b70 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
24b80 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
24b90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
24ba0 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
24bb0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
24bc0 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
24bd0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
24be0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
24bf0 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
24c00 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
24c10 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
24c20 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
24c30 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
24c40 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
24c50 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
24c60 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
24c70 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
24c80 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
24c90 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
24ca0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
24cb0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
24cc0 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
24cd0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
24ce0 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
24cf0 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
24d00 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
24d10 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
24d20 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
24d30 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
24d40 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
24d50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
24d60 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
24d70 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24d80 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
24d90 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
24da0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
24db0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
24dc0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
24dd0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
24de0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
24df0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
24e00 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
24e10 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
24e20 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
24e30 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
24e40 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
24e50 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
24e60 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
24e70 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
24e80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24e90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
24ea0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24eb0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
24ec0 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
24ed0 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
24ee0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
24ef0 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
24f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24f20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
24f30 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
24f40 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
24f50 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
24f60 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
24f70 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
24f80 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vfl;.      }.   
24f90 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
24fa0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
24fb0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
24fc0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
24fd0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
24fe0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
24ff0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
25000 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
25010 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
25020 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
25030 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
25040 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25050 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
25060 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  0.     && pCur->
25070 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
25080 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29  /ovflSize].    )
25090 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
250a0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
250b0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
250c0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
250d0 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
250e0 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
250f0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
25100 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  }..    for( ; rc
25110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
25120 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
25130 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20  ; iIdx++){..    
25140 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
25150 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
25160 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25170 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
25180 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
25190 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
251a0 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20  idOvfl)!=0 ){.  
251b0 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43        assert(!pC
251c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
251d0 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76  dx] || pCur->aOv
251e0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
251f0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
25200 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25210 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67  [iIdx] = nextPag
25220 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
25230 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
25240 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
25250 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
25260 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
25270 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
25280 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
25290 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
252a0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
252b0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
252c0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
252d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
252e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
252f0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
25300 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
25310 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
25320 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25330 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
25340 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
25350 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
25360 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
25370 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
25380 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
25390 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72  e that the aOver
253a0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73  flow[] array mus
253b0 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62  t be allocated b
253c0 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20  ecause eOp!=2.  
253d0 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20        ** here.  
253e0 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20  If eOp==2, then 
253f0 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68  offset==0 and th
25400 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76  is branch is nev
25410 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20  er taken..      
25420 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
25430 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20  ert( eOp!=2 );. 
25440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
25450 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25460 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29  BTCF_ValidOvfl )
25470 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
25480 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  ( pCur->pBtree->
25490 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20  db==pBt->db );. 
254a0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
254b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
254c0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
254d0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
254e0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
254f0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
25500 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
25510 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
25520 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
25530 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
25540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25550 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
25560 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
25570 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
25580 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
25590 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
255a0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
255b0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
255c0 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
255d0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
255e0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
255f0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
25600 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
25610 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
25620 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
25630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25640 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
25650 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
25660 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
25670 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
25680 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
25690 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
256a0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
256b0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
256c0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
256d0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
256e0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
256f0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
25700 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
25710 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
25720 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
25730 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
25740 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
25750 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
25760 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
25770 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
25780 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
25790 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
257a0 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
257b0 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
257c0 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
257d0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
257e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
257f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
25800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
25810 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
25820 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase,.        ** 
25830 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72    6) all data fr
25840 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62  om the page is b
25850 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20  eing read..     
25860 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65     **   7) at le
25870 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65  ast 4 bytes have
25880 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
25890 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ad into the outp
258a0 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20  ut buffer .     
258b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
258c0 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
258d0 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
258e0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
258f0 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
25900 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
25910 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
25920 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
25930 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
25940 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
25950 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
25960 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
25970 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
25980 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
25990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
259a0 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d   if( (eOp&0x01)=
259b0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
259c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259d0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
259e0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
259f0 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
25a30 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20      && (bEnd || 
25a40 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20  a==ovflSize)    
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
25a70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
25a80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
25a90 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ab0 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
25ac0 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
25ad0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
25ae0 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
25af0 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
25b00 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
25b10 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
25b20 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b40 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
25b50 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
25b60 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b90 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
25ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
25bb0 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
25bc0 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
25bd0 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
25be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57        assert( aW
25bf0 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20  rite>=pBufStart 
25c00 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
25c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65             /* he
25c20 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20  nce (7) */.     
25c30 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
25c40 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
25c50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
25c60 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
25c70 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
25c80 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
25c90 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
25ca0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
25cb0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
25cc0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
25cd0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
25ce0 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
25cf0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
25d00 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
25d10 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
25d20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
25d30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25d40 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
25d50 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
25d60 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
25d70 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
25d80 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
25d90 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
25da0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
25db0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
25dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25dd0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
25de0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
25df0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
25e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
25e10 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
25e20 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
25e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
25e40 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
25e50 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
25e60 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
25e70 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
25e80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25e90 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
25ea0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
25eb0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
25ec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25ed0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
25ee0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
25ef0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
25f00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
25f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25f20 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
25f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25f40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
25f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25f60 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
25f70 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
25f80 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
25f90 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
25fa0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
25fb0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
25fc0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
25fd0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
25fe0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
25ff0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
26000 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
26010 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
26020 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
26030 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
26040 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
26050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26060 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
26070 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26080 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
26090 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
260a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
260b0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
260c0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
260d0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
260e0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
260f0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
26100 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
26110 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
26120 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
26130 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26140 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26160 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26170 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
26180 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
26190 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
261a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
261b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
261c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
261d0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
261e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
261f0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
26200 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
26210 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
26220 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
26230 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
26240 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
26250 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
26260 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
26270 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
26280 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
26290 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
262a0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
262b0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
262c0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
262d0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
262e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
262f0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
26300 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
26310 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
26320 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
26330 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
26340 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
26350 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
26360 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
26370 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
26380 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
26390 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
263a0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
263b0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
263c0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
263d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
263e0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
263f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26400 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
26410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
26420 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
26430 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26440 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26450 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
26460 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
26470 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
26480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
264a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
264b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
264c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
264d0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
264e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
264f0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
26500 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26510 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
26520 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26530 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
26540 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
26550 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
26560 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
26570 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
26580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
26590 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
265a0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
265b0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
265c0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
265d0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
265e0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
265f0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
26600 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
26610 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
26620 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
26630 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
26640 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
26650 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
26660 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
26670 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
26680 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
26690 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
266a0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
266b0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
266c0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
266d0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
266e0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
266f0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
26700 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26710 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
26720 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
26730 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
26740 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
26750 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
26760 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
26770 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
26780 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
26790 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
267a0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
267b0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
267c0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
267d0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
267e0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
267f0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
26800 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
26810 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
26820 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
26830 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
26840 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
26850 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
26860 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
26870 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
26880 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
26890 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
268a0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
268b0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
268c0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
268d0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
268e0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
268f0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
26900 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
26910 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
26920 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
26930 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
26940 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
26950 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
26960 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
26970 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
26980 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
26990 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
269a0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
269b0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
269c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
269d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
269e0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
269f0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
26a00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26a10 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
26a20 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
26a30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26a40 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
26a50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26a60 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26a70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
26a80 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
26a90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
26aa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
26ab0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26ac0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26ad0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
26ae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
26af0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26b00 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
26b10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26b20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b  >info.nSize>0 );
26b30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26b40 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70  >info.pPayload>p
26b50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26b60 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20  ->iPage]->aData 
26b70 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
26b80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26b90 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
26ba0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26bb0 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45  ->iPage]->aDataE
26bc0 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
26bd0 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28  ;.  amt = (int)(
26be0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26bf0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
26c00 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  End - pCur->info
26c10 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66  .pPayload);.  if
26c20 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  ( pCur->info.nLo
26c30 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20  cal<amt ) amt = 
26c40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
26c50 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74  l;.  *pAmt = amt
26c60 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
26c70 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
26c80 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
26c90 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
26ca0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
26cb0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
26cc0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
26cd0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
26ce0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
26cf0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
26d00 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
26d10 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
26d20 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
26d30 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
26d40 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
26d50 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
26d60 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
26d70 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
26d80 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
26d90 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
26da0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
26db0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
26dc0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
26dd0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
26de0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
26df0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
26e00 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
26e10 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
26e20 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
26e30 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
26e40 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
26e50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
26e60 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
26e70 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
26e80 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
26e90 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
26ea0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
26eb0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
26ec0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
26ed0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
26ee0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
26ef0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
26f00 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74  32 *pAmt){.  ret
26f10 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64  urn fetchPayload
26f20 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a  (pCur, pAmt);.}.
26f30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
26f40 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
26f50 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
26f60 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
26f70 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
26f80 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
26f90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
26fa0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
26fb0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
26fc0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
26fd0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
26fe0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
26ff0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27000 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
27010 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27020 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
27030 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
27040 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
27050 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
27060 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
27070 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
27080 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
27090 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
270a0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
270b0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
270c0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
270d0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
270e0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
270f0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
27100 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
27110 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
27120 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
27130 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
27140 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
27150 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
27160 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27170 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27180 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27190 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
271a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
271b0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
271c0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
271d0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
271e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
271f0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
27200 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
27210 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27220 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27230 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
27240 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
27250 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27260 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
27270 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
27280 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  fl);.  pCur->iPa
27290 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69  ge++;.  pCur->ai
272a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
272b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67   = 0;.  return g
272c0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
272d0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75  t, newPgno, &pCu
272e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
272f0 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50  pCur, pCur->curP
27320 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23  agerFlags);.}..#
27330 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
27340 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
27350 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
27360 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
27370 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
27380 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
27390 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
273a0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
273b0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
273c0 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
273d0 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
273e0 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
273f0 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
27400 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
27410 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
27420 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
27430 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
27440 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
27450 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
27460 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
27470 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
27480 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
27490 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
274a0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
274b0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
274c0 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
274d0 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
274e0 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
274f0 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
27520 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
27530 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
27540 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
27550 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
27560 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
27570 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
27580 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
27590 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
275a0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
275b0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
275c0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
275d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
275e0 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
275f0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
27600 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
27610 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
27620 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
27630 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
27640 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
27650 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
27660 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
27670 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
27680 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
27690 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
276a0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
276b0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
276c0 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
276d0 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
276e0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
276f0 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
27700 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
27710 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
27720 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
27730 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
27740 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
27750 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
27760 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
27770 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27780 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27790 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
277a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
277b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
277c0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
277d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
277e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
277f0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
27800 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
27810 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27820 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
27830 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27840 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
27850 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27860 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
27870 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
27880 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27890 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
278a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
278b0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
278c0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
278d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
278e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
278f0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
27900 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
27910 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
27920 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
27930 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27940 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
27950 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
27960 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
27970 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
27980 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
27990 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
279a0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
279b0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
279c0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
279d0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
279e0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
279f0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
27a00 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
27a10 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
27a20 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
27a30 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
27a40 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
27a50 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
27a60 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
27a70 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
27a80 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
27a90 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
27aa0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
27ab0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
27ac0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
27ad0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
27ae0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
27af0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
27b00 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
27b10 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
27b20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
27b30 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
27b40 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
27b50 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
27b60 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
27b70 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
27b80 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
27b90 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
27ba0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
27bb0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
27bc0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
27bd0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
27be0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
27bf0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
27c00 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
27c10 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
27c20 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
27c30 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
27c40 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
27c50 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
27c60 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
27c70 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
27c80 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
27c90 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
27ca0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
27cb0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
27cc0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
27cd0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
27ce0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
27cf0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
27d00 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
27d10 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
27d20 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
27d30 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
27d40 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
27d50 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
27d60 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
27d70 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
27d80 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
27d90 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
27da0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
27db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
27dc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27dd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27de0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
27df0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
27e00 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
27e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
27e20 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
27e30 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
27e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
27e50 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
27e60 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
27e70 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
27e80 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
27e90 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
27ea0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
27eb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
27ec0 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
27ed0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
27ee0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
27ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
27f00 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
27f10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
27f20 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
27f30 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
27f40 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27f50 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
27f60 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
27f70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27f80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27f90 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  age]!=0 );.     
27fa0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
27fb0 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
27fc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
27fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
27fe0 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
27ff0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
28000 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
28010 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
28020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28040 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28050 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  ge==(-1) );.    
28060 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
28070 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
28080 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70  InitPage(pCur->p
28090 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72  Btree->pBt, pCur
280a0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
280b0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20  r->apPage[0],.  
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
280e0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
280f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28110 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28120 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28140 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
28150 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  >iPage = 0;.  }.
28160 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
28170 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
28180 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
28190 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
281a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
281b0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
281c0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
281d0 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
281e0 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
281f0 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
28200 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
28210 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
28220 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
28230 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
28240 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
28250 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
28260 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
28270 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
28280 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
28290 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
282a0 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
282b0 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
282c0 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
282d0 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
282e0 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
282f0 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
28300 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
28310 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
28320 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
28330 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
28340 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
28350 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
28360 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
28370 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
28380 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
28390 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
283a0 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
283b0 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
283c0 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
283d0 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
283e0 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
283f0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
28400 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
28410 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
28420 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
28430 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
28440 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
28450 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
28460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28470 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28480 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  }..  pCur->aiIdx
28490 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
284a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
284b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
284c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
284d0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  st|BTCF_ValidNKe
284e0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
284f0 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  );..  if( pRoot-
28500 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
28510 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28520 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
28530 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
28540 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
28550 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
28560 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
28570 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
28580 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28590 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
285a0 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
285b0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
285c0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
285d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
285e0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
285f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
28600 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
28610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
28620 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28630 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d  SOR_INVALID;.  }
28640 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28650 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28660 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
28670 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
28680 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
28690 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
286a0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
286b0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
286c0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
286d0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
286e0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
286f0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
28700 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
28710 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
28720 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
28730 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
28740 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
28750 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
28760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28770 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
28780 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28790 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
287a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
287b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
287c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
287d0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
287e0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
287f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28800 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
28810 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
28820 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28830 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
28840 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
28850 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
28860 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
28870 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28880 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
28890 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
288a0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
288b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
288c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
288d0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
288e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
288f0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
28900 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
28910 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
28920 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
28930 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
28940 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
28950 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
28960 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
28970 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
28980 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
28990 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
289a0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
289b0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
289c0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
289d0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
289e0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
289f0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
28a00 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
28a10 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
28a20 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
28a30 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
28a40 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
28a50 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
28a60 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
28a70 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
28a80 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
28a90 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
28aa0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
28ab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
28ac0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
28ad0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28ae0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28af0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28b00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28b10 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28b20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
28b30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28b40 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
28b50 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
28b60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
28b70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
28b80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
28b90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28ba0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
28bb0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
28bc0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
28bd0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
28be0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28bf0 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
28c00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28c10 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
28c20 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l-1;.  assert( p
28c30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
28c40 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28c50 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28c60 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
28c70 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
28c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
28c90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
28ca0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
28cb0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
28cc0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
28cd0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
28ce0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
28cf0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
28d00 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
28d10 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
28d20 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
28d30 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
28d40 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
28d50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
28d60 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
28d70 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
28d80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
28d90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28da0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28db0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28dc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
28dd0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
28de0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
28df0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
28e00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28e10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
28e20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28e30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
28e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28e50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28e60 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
28e70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28e80 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
28e90 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
28ea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28eb0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
28ec0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28ed0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
28ee0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
28ef0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
28f00 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
28f10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
28f20 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
28f30 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
28f40 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
28f50 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
28f60 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
28f70 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
28f80 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
28f90 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
28fa0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
28fb0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
28fc0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
28fd0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
28fe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
28ff0 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
29000 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
29010 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
29020 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29030 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29040 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29050 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29060 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
29070 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
29080 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
29090 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
290a0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
290b0 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
290c0 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
290d0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
290e0 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
290f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29100 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
29110 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
29120 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
29130 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
29140 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
29150 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
29160 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
29170 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
29180 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
29190 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
291a0 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
291b0 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
291c0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
291d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
291e0 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
291f0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
29200 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
29210 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
29220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
29230 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29240 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
29250 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
29260 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29270 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
29280 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
29290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
292a0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
292b0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
292c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
292d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
292e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
292f0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
29300 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29310 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
29320 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29330 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29340 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
29350 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
29360 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
29370 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29380 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29390 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
293a0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
293b0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
293c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
293d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
293e0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
293f0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
29400 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
29410 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
29420 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
29430 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
29440 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
29450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29460 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29470 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
29480 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
29490 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
294a0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
294b0 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
294c0 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
294d0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
294e0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
294f0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
29500 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
29510 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
29520 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
29530 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
29540 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
29550 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
29560 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
29570 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
29580 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
29590 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
295a0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
295b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
295c0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
295d0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
295e0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
295f0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
29600 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
29610 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
29620 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
29630 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
29640 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
29650 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
29660 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
29670 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
29680 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
29690 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
296a0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
296b0 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
296c0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
296d0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
296e0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
296f0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
29700 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
29710 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
29720 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
29730 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
29740 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
29750 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
29760 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
29770 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
29780 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
29790 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
297a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
297b0 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
297c0 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
297d0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
297e0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
297f0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
29800 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
29810 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
29820 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
29840 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
29850 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
29860 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
29870 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
29880 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
29890 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
298a0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
298b0 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
298c0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
298d0 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
298e0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
298f0 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
29900 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
29910 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
29920 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
29930 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
29940 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
29950 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
29960 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
29970 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
29980 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
29990 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
299a0 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
299b0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
299c0 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
299d0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
299e0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
299f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
29a00 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
29a10 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
29a20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64  int rc;.  Record
29a30 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43  Compare xRecordC
29a40 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72  ompare;..  asser
29a50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29a60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29a70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29a80 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29a90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29aa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
29ab0 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
29ac0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
29ad0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
29ae0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
29af0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
29b00 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
29b10 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
29b20 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
29b30 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
29b40 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
29b50 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
29b60 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
29b70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29b80 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
29b90 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29ba0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
29bb0 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
29bc0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
29bd0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
29be0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
29bf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
29c00 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
29c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29c20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
29c30 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29c40 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
29c50 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
29c60 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
29c70 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
29c80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29c90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29ca0 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
29cb0 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
29cc0 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
29cd0 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
29ce0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
29cf0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
29d00 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
29d10 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
29d20 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
29d30 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
29d40 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
29d50 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
29d60 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
29d70 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
29d80 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
29d90 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
29da0 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
29db0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
29dc0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
29dd0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
29de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29df0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29e00 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29e10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29e20 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
29e30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
29e40 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
29e50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29e60 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
29e70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29e80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29e90 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
29ea0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29eb0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
29ec0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29ed0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29ee0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
29ef0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
29f00 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29f10 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29f20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29f30 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
29f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29f50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
29f60 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29f70 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
29f80 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
29f90 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
29fa0 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
29fb0 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
29fc0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
29fd0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29fe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
29ff0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2a020 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2a030 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2a040 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2a050 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2a060 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2a070 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2a080 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2a090 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2a0a0 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2a0b0 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2a0c0 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2a0d0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2a0e0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2a0f0 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2a100 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2a110 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2a120 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2a130 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2a140 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2a150 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2a160 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2a170 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2a180 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2a190 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2a1a0 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2a1b0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2a1c0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2a1d0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2a1e0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2a1f0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2a200 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2a210 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a220 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2a230 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2a240 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2a250 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2a260 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2a270 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2a280 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2a290 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2a2a0 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2a2b0 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2a2c0 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2a2d0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2a2e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a2f0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2a300 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2a310 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2a320 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2a330 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2a340 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2a350 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2a360 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2a370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a380 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2a390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2a3a0 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2a3b0 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2a3c0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2a3d0 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2a3e0 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
2a3f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2a420 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2a430 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2a440 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2a450 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2a460 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2a470 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2a480 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2a490 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2a4a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2a4b0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2a4c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2a4d0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2a4e0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2a4f0 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2a500 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2a510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a520 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2a530 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2a540 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a550 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
2a560 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  idNKey;.        
2a570 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2a580 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2a590 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2a5a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a5b0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2a5c0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2a5d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2a5e0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2a5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2a600 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2a610 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2a620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a630 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2a660 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2a670 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2a680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2a690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2a6a0 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2a6b0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2a6c0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2a6d0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  x = (lwr+upr)/2;
2a6e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2a6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
2a700 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  (;;){.        in
2a710 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a  t nCell;  /* Siz
2a720 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63  e of the pCell c
2a730 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ell in bytes */.
2a740 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2a750 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2a760 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20  pPage, idx);..  
2a770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
2a780 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
2a790 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
2a7a0 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
2a7b0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
2a7c0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
2a7d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
2a7e0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
2a7f0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
2a800 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2a810 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
2a820 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
2a830 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
2a840 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
2a850 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
2a860 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
2a870 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
2a880 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
2a890 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2a8a0 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
2a8b0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
2a8c0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
2a8d0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
2a8e0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
2a8f0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
2a900 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
2a910 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
2a920 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
2a930 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
2a940 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
2a950 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d  .        nCell =
2a960 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
2a970 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
2a980 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
2a990 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  load ){.        
2a9a0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2a9b0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
2a9c0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
2a9d0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
2a9e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
2a9f0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
2aa00 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
2aa10 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2aa20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
2aa30 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
2aa40 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2aa50 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2aa60 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d  +nCell+1==pPage-
2aa70 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2aa80 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2aa90 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2aaa0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
2aab0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2aac0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
2aad0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
2aae0 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
2aaf0 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
2ab00 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
2ab10 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
2ab20 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
2ab30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2ab40 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
2ab50 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
2ab60 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2ab70 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
2ab80 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
2ab90 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
2aba0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2abb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2abc0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2abd0 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
2abe0 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2abf0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2ac00 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2ac10 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
2ac20 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2ac30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ac40 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
2ac50 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
2ac60 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
2ac70 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
2ac80 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
2ac90 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
2aca0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
2acb0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
2acc0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2acd0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
2ace0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
2acf0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
2ad00 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
2ad10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
2ad20 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
2ad30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
2ad40 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20  an be called. . 
2ad50 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
2ad60 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
2ad70 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2ad80 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f  t, the xRecordCo
2ad90 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61  mpare routine ma
2ada0 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20  y read.         
2adb0 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61   ** up to two va
2adc0 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65  rints past the e
2add0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2ade0 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20  . An extra 18 . 
2adf0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65           ** byte
2ae00 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  s of padding is 
2ae10 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65  allocated at the
2ae20 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2ae30 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  er in.          
2ae40 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70  ** case this hap
2ae50 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  pens.  */.      
2ae60 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
2ae70 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  ey;.          u8
2ae80 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f   * const pCellBo
2ae90 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61  dy = pCell - pPa
2aea0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
2aeb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2aec0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
2aed0 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
2aee0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
2aef0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2af00 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
2af10 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
2af20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c  testcase( nCell<
2af30 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69  0 );   /* True i
2af40 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e  f key size is 2^
2af50 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20  32 or more */.  
2af60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2af70 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f  ( nCell==0 );  /
2af80 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2af90 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2afa0 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x00 */.         
2afb0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2afc0 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==1 );  /* Inval
2afd0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2afe0 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a  80 0x80 0x01 */.
2aff0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b000 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20  se( nCell==2 ); 
2b010 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61   /* Minimum lega
2b020 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65  l index key size
2b030 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2b040 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20  ( nCell<2 ){.   
2b050 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2b060 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b070 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2b080 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b090 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b0a0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2b0b0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2b0c0 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2b0d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2b0e0 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2b0f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2b100 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2b110 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b120 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2b130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b140 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b150 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b160 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b170 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
2b180 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c  ad(pCur, 0, nCel
2b190 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  l, (unsigned cha
2b1a0 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b  r*)pCellKey, 2);
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b1c0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2b1d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2b1e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2b1f0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b200 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2b210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2b220 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2b230 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2b240 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2b250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2b260 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2b270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b280 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2b290 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2b2a0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2b2b0 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2b2c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2b2d0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2b2e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2b2f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2b310 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2b320 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2b330 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2b340 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2b350 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2b360 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2b370 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2b380 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2b390 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2b3a0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2b3b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2b3c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b3d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2b3e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2b3f0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2b400 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2b410 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2b420 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2b430 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2b440 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b460 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
2b470 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
2b480 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2b490 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2b4a0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2b4b0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2b4c0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
2b4d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
2b4e0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
2b4f0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
2b500 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2b510 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
2b520 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2b530 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2b540 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
2b550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2b560 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
2b570 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b580 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2b590 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2b5a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b5b0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2b5c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2b5d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b5e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2b5f0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b600 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2b610 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2b620 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2b630 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2b640 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2b650 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b660 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b680 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2b690 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2b6a0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2b6b0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
2b6c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2b6d0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2b6e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b6f0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2b700 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2b710 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2b720 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2b730 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2b740 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b750 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2b760 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2b770 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2b780 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2b790 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2b7a0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2b7b0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2b7c0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2b7d0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2b7e0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2b7f0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2b800 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2b810 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2b820 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2b830 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2b840 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2b850 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2b860 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2b870 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2b880 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2b890 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2b8a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2b8b0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2b8c0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2b8d0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2b8e0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2b8f0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2b900 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2b910 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2b920 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2b930 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2b940 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2b950 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2b960 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2b970 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2b980 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2b990 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2b9a0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2b9b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
2b9c0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2b9d0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2b9e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b9f0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2ba00 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2ba10 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2ba20 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2ba30 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2ba40 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2ba50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2ba60 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2ba70 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2ba80 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2ba90 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2baa0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2bab0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2bac0 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2bad0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2bae0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2baf0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2bb00 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2bb10 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2bb20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2bb30 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2bb40 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2bb50 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2bb60 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2bb70 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2bb80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2bb90 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2bba0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2bbb0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2bbc0 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2bbd0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2bbe0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2bbf0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2bc00 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2bc10 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2bc20 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2bc30 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2bc40 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2bc50 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2bc60 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2bc70 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2bc80 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2bc90 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2bca0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2bcb0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2bcc0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2bcd0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2bce0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2bcf0 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2bd00 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2bd10 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2bd20 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2bd30 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2bd40 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2bd50 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2bd60 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2bd70 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2bd80 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2bd90 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2bda0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2bdb0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2bdc0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2bdd0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2bde0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2bdf0 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2be00 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2be10 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2be20 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2be30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2be40 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2be50 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2be60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2be70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2be80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2be90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2bea0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2beb0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2bec0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2bed0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2bee0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2bef0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2bf00 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2bf10 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2bf20 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2bf30 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2bf40 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2bf50 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2bf60 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2bf70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bf80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2bf90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2bfa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2bfb0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2bfc0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2bfd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bfe0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2bff0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2c000 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2c010 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c020 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c030 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2c040 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2c050 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2c060 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2c070 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2c080 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2c090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2c0a0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2c0b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c0c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c0d0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2c0e0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2c0f0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2c100 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2c110 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2c120 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2c130 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2c140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2c150 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2c160 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2c170 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2c180 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2c190 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2c1a0 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2c1b0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2c1c0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2c1d0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2c1e0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2c1f0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2c200 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2c210 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2c220 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2c230 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2c240 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2c250 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2c260 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2c270 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2c280 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2c290 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2c2a0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2c2b0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2c2c0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2c2d0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2c2e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2c2f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2c300 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2c310 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2c320 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2c330 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2c340 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2c350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2c360 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2c370 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2c380 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2c390 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2c3a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2c3b0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2c3c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2c3d0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2c3e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2c3f0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2c400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c410 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2c420 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2c430 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2c440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c450 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2c460 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2c470 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2c480 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2c490 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2c4a0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2c4b0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2c4c0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2c4d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c4e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c4f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2c500 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2c510 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2c520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2c530 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2c540 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2c550 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2c560 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c580 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2c590 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2c5a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2c5b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2c5c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2c5d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2c5e0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2c5f0 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2c600 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2c610 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2c620 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2c630 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
2c640 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2c650 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c660 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2c670 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2c680 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
2c690 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2c6a0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2c6b0 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2c6c0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2c6d0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2c6e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c6f0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2c700 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c710 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
2c720 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2c730 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c740 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
2c750 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2c760 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2c770 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2c780 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2c790 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2c7a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2c7b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2c7c0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2c7d0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2c7e0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2c7f0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2c800 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2c810 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2c820 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2c830 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2c840 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2c850 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2c860 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2c870 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2c880 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2c890 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2c8a0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2c8b0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2c8c0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2c8d0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2c8e0 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
2c8f0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2c900 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2c910 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2c920 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
2c930 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2c940 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2c950 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2c960 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
2c970 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2c980 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2c990 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
2c9a0 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
2c9b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2c9c0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2c9d0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2c9e0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
2c9f0 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
2ca00 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2ca10 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2ca20 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2ca30 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2ca40 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2ca50 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2ca60 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2ca70 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2ca80 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2ca90 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2caa0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2cab0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2cac0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2cad0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2cae0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2caf0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2cb00 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2cb10 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2cb20 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2cb30 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2cb40 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2cb50 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2cb60 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2cb70 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2cb80 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2cb90 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2cba0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2cbb0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2cbc0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2cbd0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cbe0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2cbf0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2cc00 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2cc10 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2cc20 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2cc30 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2cc40 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2cc50 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2cc60 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2cc70 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2cc80 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2cc90 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2cca0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2ccb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2ccc0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2ccd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2cce0 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
2ccf0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2cd00 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2cd10 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2cd20 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2cd30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2cd40 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2cd50 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2cd60 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2cd70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2cd80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2cd90 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2cda0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2cdb0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2cdc0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2cdd0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2cde0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cdf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ce00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ce10 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2ce20 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2ce30 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2ce40 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2ce50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ce60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ce70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2ce80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ce90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cea0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2ceb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2cec0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2ced0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2cee0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2cef0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2cf00 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
2cf10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2cf20 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2cf30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cf40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2cf50 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2cf60 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2cf70 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2cf80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2cf90 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
2cfa0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2cfb0 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
2cfc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
2cfd0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2cfe0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2cff0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2d000 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2d010 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2d020 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
2d030 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d040 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
2d050 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2d060 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2d070 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
2d080 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d090 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
2d0a0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2d0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2d0c0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2d0d0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2d0e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2d0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2d110 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2d120 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
2d130 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d140 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2d150 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2d160 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d170 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
2d180 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2d190 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
2d1a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d1b0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
2d1c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d1d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2d1e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2d1f0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2d200 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2d210 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2d220 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2d230 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2d240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d250 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2d260 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2d270 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d280 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2d290 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d2a0 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
2d2b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2d2c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d2d0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2d2e0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2d2f0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2d300 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d310 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2d320 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2d330 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2d340 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2d350 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2d360 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2d370 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2d380 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2d390 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d3a0 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2d3b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d3c0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2d3d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d3e0 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2d3f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d400 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2d410 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2d420 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2d430 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2d440 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d450 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2d460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2d480 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2d490 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2d4a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2d4b0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2d4c0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2d4d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2d4e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d4f0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2d500 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2d510 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2d520 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2d530 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2d540 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2d550 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2d560 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2d570 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2d580 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d590 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2d5a0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2d5b0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2d5c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d5d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2d5e0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2d5f0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2d600 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2d610 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2d620 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2d630 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2d640 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2d650 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2d660 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2d670 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2d680 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2d690 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2d6a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2d6b0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2d6c0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2d6d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2d6e0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2d6f0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2d700 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2d710 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2d720 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2d730 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2d740 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2d750 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2d760 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2d770 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2d780 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2d790 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2d7a0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2d7b0 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2d7c0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2d7d0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2d7e0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2d7f0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2d800 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2d810 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2d820 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2d830 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2d840 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2d850 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2d860 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2d870 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2d880 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2d890 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2d8a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d8b0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2d8c0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2d8d0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2d8e0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2d8f0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2d900 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2d910 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2d920 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2d930 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2d940 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2d950 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2d960 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2d970 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2d980 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2d990 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2d9a0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2d9b0 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2d9c0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2d9d0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2d9e0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2d9f0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2da00 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2da10 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2da20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2da30 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2da40 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2da50 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2da60 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2da70 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2da80 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2da90 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2daa0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2dab0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2dac0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2dad0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2dae0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2daf0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2db00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2db10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2db20 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2db30 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2db40 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2db50 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2db60 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2db70 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2db80 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2db90 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2dba0 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2dbb0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2dbc0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2dbd0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2dbe0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2dbf0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2dc00 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2dc10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2dc20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2dc30 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2dc40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2dc50 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2dc60 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2dc70 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2dc80 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2dc90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2dca0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2dcb0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2dcc0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2dcd0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2dce0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2dcf0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2dd00 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2dd10 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2dd20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2dd30 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2dd40 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2dd50 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2dd60 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2dd70 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2dd80 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2dd90 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2dda0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2ddb0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2ddc0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2ddd0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2dde0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2ddf0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2de00 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2de10 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2de20 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2de30 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2de40 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2de50 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2de60 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2de70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2de80 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2de90 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2dea0 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2deb0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2dec0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2ded0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2dee0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2def0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2df00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2df10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2df20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2df30 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2df40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2df50 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2df60 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2df70 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2df80 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2df90 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2dfa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2dfb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2dfc0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2dfd0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2dfe0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2dff0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2e000 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2e010 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2e020 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2e030 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2e040 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2e050 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2e060 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2e070 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2e080 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2e090 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e0a0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2e0b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2e0c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e0d0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2e0e0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2e0f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2e100 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2e110 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2e120 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2e130 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2e140 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2e150 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2e160 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2e170 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2e180 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2e190 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2e1a0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2e1b0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2e1c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2e1d0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2e1e0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2e1f0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2e200 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2e210 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2e220 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2e230 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2e240 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2e250 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2e260 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2e270 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2e280 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2e290 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2e2a0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2e2b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2e2c0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e2d0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2e2e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2e2f0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2e300 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2e310 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2e320 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2e330 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2e340 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2e350 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2e360 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2e370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e380 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2e390 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2e3a0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2e3b0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2e3c0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2e3d0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2e3e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2e3f0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2e400 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2e410 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2e420 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2e430 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2e440 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2e450 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e460 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2e470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2e480 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2e490 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2e4a0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2e4b0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2e4c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2e4d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2e4e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2e4f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2e500 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2e510 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2e520 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2e530 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e540 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2e550 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2e560 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2e570 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2e580 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2e590 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2e5a0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2e5b0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2e5c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2e5d0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2e5e0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2e5f0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2e600 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2e610 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2e620 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2e630 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2e640 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2e650 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2e660 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2e670 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2e680 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2e690 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2e6a0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2e6b0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2e6c0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2e6d0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2e6e0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2e6f0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2e700 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2e710 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2e720 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2e730 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2e740 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2e750 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2e760 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e770 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2e780 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2e790 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2e7a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2e7b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2e7c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e7d0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2e7e0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2e7f0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2e800 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2e810 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2e820 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2e830 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2e840 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2e850 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2e860 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2e870 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2e880 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2e890 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2e8a0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2e8b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2e8c0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2e8d0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2e8e0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2e8f0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2e900 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2e910 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2e920 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2e930 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2e940 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2e950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2e960 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2e970 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2e980 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2e990 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2e9a0 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2e9b0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2e9c0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2e9d0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e9e0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2e9f0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2ea00 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2ea10 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2ea20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2ea30 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2ea40 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2ea50 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2ea60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2ea70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2ea80 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2ea90 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2eaa0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2eab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2eac0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ead0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2eae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2eaf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2eb00 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2eb10 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2eb20 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2eb30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2eb40 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2eb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2eb60 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2eb70 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2eb80 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2eb90 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ebb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ebc0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2ebd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2ebe0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ebf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ec00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2ec10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2ec20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ec30 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2ec40 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2ec50 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2ec60 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2ec70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ec80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ec90 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2eca0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2ecb0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2ecc0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2ecd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2ece0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2ecf0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2ed00 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2ed10 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
2ed20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2ed30 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
2ed40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ed50 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
2ed60 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
2ed70 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
2ed80 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2ed90 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
2eda0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
2edb0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
2edc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2edd0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2ede0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2edf0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ee00 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ee10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ee20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
2ee30 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2ee40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
2ee50 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2ee60 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2ee70 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2ee80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ee90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2eea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2eeb0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2eec0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2eed0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2eee0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2eef0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2ef00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ef10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ef20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ef30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2ef40 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2ef50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2ef60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2ef70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ef80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2ef90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2efa0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2efb0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2efc0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2efd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2efe0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2eff0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2f000 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2f010 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2f020 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2f030 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f040 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2f050 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2f060 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2f070 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2f080 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f090 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2f0a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2f0b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2f0c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f0d0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2f0e0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2f0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2f100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f110 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2f120 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2f130 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2f150 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f160 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2f170 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2f180 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2f190 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f1a0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2f1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f1c0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2f1d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2f1e0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f1f0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2f200 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2f210 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2f220 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2f230 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2f240 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2f250 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2f260 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2f270 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2f280 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2f290 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2f2a0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2f2b0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2f2c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2f2d0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2f2e0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2f2f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2f300 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f310 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2f320 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2f330 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2f340 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2f350 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2f360 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2f370 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2f380 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2f390 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2f3a0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2f3b0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2f3c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2f3d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f400 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2f410 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2f420 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2f430 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2f440 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2f450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2f460 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2f470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2f480 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2f490 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2f4a0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2f4b0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2f4c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2f4d0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2f4e0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2f4f0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2f500 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f550 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2f560 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2f570 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2f580 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2f590 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2f5a0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2f5b0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2f5c0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2f5d0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2f5e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f5f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f600 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f610 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f630 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2f640 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2f650 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2f660 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2f670 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2f680 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2f690 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2f6a0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2f6b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2f6c0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2f6d0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2f6e0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2f6f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2f700 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2f710 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2f720 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2f730 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2f740 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2f750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f760 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2f770 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2f780 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2f790 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f7a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2f7b0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2f7c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f7d0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2f7e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f7f0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2f800 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2f810 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2f820 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2f830 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2f840 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2f850 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2f860 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2f870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2f880 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2f890 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2f8a0 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
2f8b0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2f8c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2f8d0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
2f8e0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
2f8f0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
2f900 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
2f910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f940 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
2f950 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
2f960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f980 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
2f990 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2f9a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2f9b0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
2f9c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f9e0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2f9f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fa00 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
2fa10 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
2fa20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
2fa30 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
2fa40 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
2fa50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fa60 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
2fa70 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2fa80 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
2fa90 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2faa0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2fab0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
2fac0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
2fad0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
2fae0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
2faf0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
2fb00 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
2fb10 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
2fb20 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
2fb30 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
2fb40 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
2fb50 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2fb60 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
2fb70 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
2fb80 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
2fb90 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
2fba0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
2fbb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2fbc0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
2fbd0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
2fbe0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
2fbf0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
2fc00 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
2fc10 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
2fc20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
2fc30 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
2fc40 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
2fc50 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
2fc60 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
2fc70 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
2fc80 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
2fc90 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
2fca0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
2fcb0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
2fcc0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
2fcd0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
2fce0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
2fcf0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
2fd00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2fd10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2fd20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
2fd30 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
2fd40 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
2fd50 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
2fd60 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
2fd70 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
2fd80 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2fd90 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2fda0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
2fdb0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
2fdc0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
2fdd0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
2fde0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
2fdf0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
2fe00 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
2fe10 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
2fe20 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
2fe30 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2fe40 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
2fe50 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2fe60 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2fe70 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
2fe80 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
2fe90 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
2fea0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
2feb0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
2fec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fed0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
2fee0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
2fef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2ff00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
2ff10 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2ff20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2ff30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ff40 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
2ff50 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
2ff60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ff70 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2ff80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2ff90 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
2ffa0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2ffb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2ffc0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
2ffd0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
2ffe0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
2fff0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
30000 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
30010 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
30020 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
30030 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
30040 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
30050 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
30060 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
30070 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
30080 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
30090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
300a0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
300b0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
300c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
300d0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
300e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
300f0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
30100 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30110 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
30120 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30130 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
30140 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
30150 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
30160 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
30170 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
30180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
301a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
301b0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
301c0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
301d0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
301e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
301f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30200 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
30210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
30220 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
30230 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30240 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
30250 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
30260 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
30270 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
30280 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
30290 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
302a0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
302b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
302c0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
302d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
302e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
302f0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
30300 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
30310 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
30320 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30330 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
30340 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30350 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
30360 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
30370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30390 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
303a0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
303b0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
303c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
303d0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
303e0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
303f0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
30400 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30410 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
30420 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
30430 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30440 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
30450 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
30460 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
30470 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
30480 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
30490 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
304a0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
304b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
304c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
304d0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
304e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
304f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
30500 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
30510 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
30520 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
30530 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
30540 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
30550 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
30560 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
30570 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
30580 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
30590 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
305a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
305b0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
305c0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
305d0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
305e0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
305f0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
30600 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
30610 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
30620 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
30630 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
30640 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
30650 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
30660 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
30670 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
30680 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
30690 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
306a0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
306b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
306c0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
306d0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
306e0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
306f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
30700 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
30710 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
30720 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
30730 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
30740 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
30750 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30770 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
30780 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
30790 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
307c0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
307d0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
307e0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
307f0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
30800 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
30810 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
30820 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
30830 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
30840 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30850 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
30860 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
30870 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30890 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
308a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
308b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
308c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
308d0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
308e0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
308f0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
30900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30910 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
30920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
30930 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
30940 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
30950 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
30960 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
30970 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
30980 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
30990 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
309a0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
309b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
309c0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
309d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
309e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
309f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
30a00 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
30a10 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
30a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
30a30 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
30a40 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
30a50 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
30a60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30a70 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
30a80 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
30a90 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
30aa0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
30ab0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30ac0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
30ad0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30ae0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
30af0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
30b00 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
30b10 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
30b20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
30b30 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
30b40 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
30b50 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
30b60 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
30b70 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
30b80 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
30b90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
30ba0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
30bb0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
30bc0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
30bd0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
30be0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
30bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30c00 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
30c10 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
30c20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
30c30 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
30c40 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
30c50 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
30c60 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
30c70 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
30c80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
30c90 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
30ca0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
30cb0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
30cc0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
30cd0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
30ce0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
30cf0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
30d00 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
30d10 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
30d20 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
30d30 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
30d40 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30d50 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
30d60 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
30d70 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
30d80 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
30d90 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
30da0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
30db0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
30dc0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
30dd0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
30de0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
30df0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
30e00 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
30e10 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
30e20 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
30e30 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
30e40 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
30e50 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
30e60 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
30e70 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
30e80 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
30e90 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
30ea0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
30eb0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
30ec0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
30ed0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
30ee0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
30ef0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
30f00 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
30f10 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
30f20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
30f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30f40 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
30f50 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
30f60 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
30f70 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
30f80 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30f90 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
30fa0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
30fb0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
30fc0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
30fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30fe0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
30ff0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31000 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
31010 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31020 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
31030 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
31040 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
31050 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
31060 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31070 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
31080 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31090 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
310a0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
310b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
310c0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
310d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
310e0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
310f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
31100 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
31110 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
31120 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
31130 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
31140 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
31150 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
31160 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
31170 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
31180 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
31190 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
311a0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
311b0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
311c0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
311d0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
311e0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
311f0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
31200 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
31210 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
31220 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
31230 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
31240 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
31250 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
31260 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
31270 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
31280 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
31290 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
312a0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
312b0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
312c0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
312d0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
312e0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
312f0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
31300 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31310 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
31320 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
31330 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
31340 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
31350 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
31360 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
31370 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
31380 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
31390 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
313a0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
313b0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
313c0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
313d0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
313e0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
313f0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
31400 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
31410 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
31420 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
31430 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
31440 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
31450 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
31460 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
31470 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
31480 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
31490 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
314a0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
314b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
314c0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
314d0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
314e0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
314f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
31500 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
31510 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31520 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
31530 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
31540 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
31550 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
31560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31570 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
31580 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
315a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
315b0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
315c0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
315d0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
315e0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
315f0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
31600 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
31610 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
31620 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
31630 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
31640 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
31650 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
31660 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
31670 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
31690 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
316a0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
316b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
316c0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
316d0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
316e0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
316f0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
31700 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
31710 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31720 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
31730 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
31740 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
31750 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
31760 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
31770 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
31780 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
31790 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
317a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
317b0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
317c0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
317d0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
317e0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
317f0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
31800 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
31810 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
31820 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
31830 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
31840 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
31850 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
31860 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
31870 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
31880 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
31890 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
318a0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
318b0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
318c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
318d0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
318e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
318f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
31900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31910 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31920 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
31930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31940 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
31950 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
31960 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
31970 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
31980 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
31990 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
319a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
319b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
319c0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
319d0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
319e0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
319f0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
31a00 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
31a10 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
31a20 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
31a30 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
31a40 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
31a50 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
31a60 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
31a70 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
31a80 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
31a90 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
31aa0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
31ab0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
31ac0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
31ad0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
31ae0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
31af0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
31b00 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
31b10 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
31b20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
31b30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
31b40 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
31b50 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
31b60 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
31b70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
31b80 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
31b90 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
31ba0 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
31bb0 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
31bc0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
31bd0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
31be0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
31bf0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
31c00 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
31c10 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
31c20 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
31c30 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
31c40 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
31c50 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
31c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
31c70 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
31c80 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
31c90 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
31ca0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
31cb0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
31cc0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
31cd0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
31ce0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
31cf0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
31d00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31d10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
31d20 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
31d30 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
31d40 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
31d50 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
31d60 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
31d70 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
31d80 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
31d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31da0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
31db0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
31dc0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
31dd0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
31de0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
31df0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
31e00 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
31e10 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
31e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31e30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
31e40 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
31e50 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
31e60 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
31e70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
31e80 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
31e90 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
31ea0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
31eb0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
31ec0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
31ed0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
31ee0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
31ef0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
31f00 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
31f10 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
31f20 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
31f30 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
31f40 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
31f50 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
31f60 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
31f70 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
31f80 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
31f90 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
31fa0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
31fb0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
31fc0 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
31fd0 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
31fe0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
31ff0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
32000 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
32010 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
32020 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
32030 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
32040 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
32050 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
32060 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
32070 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
32080 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
32090 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
320a0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
320b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
320c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
320d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
320e0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
320f0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
32100 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
32110 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
32120 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32130 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32140 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
32150 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
32160 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
32170 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
32180 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
32190 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
321a0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
321b0 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
321c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
321d0 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
321e0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
321f0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
32200 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
32210 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
32220 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
32230 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
32240 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
32250 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
32260 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
32270 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
32280 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
32290 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
322a0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
322b0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
322c0 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
322d0 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
322e0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
322f0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
32300 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
32310 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
32320 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
32330 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
32340 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
32350 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
32360 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
32370 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
32380 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
32390 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
323a0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
323b0 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
323c0 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
323d0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
323e0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
323f0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
32400 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
32410 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
32420 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
32430 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
32440 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32450 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
32470 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
32480 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
32490 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
324a0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
324b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
324c0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
324d0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
324e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
324f0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
32500 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
32510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
32530 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
32540 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
32550 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
32560 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
32570 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
32580 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
32590 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
325a0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
325b0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
325c0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
325d0 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
325e0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
325f0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
32600 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
32610 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
32620 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
32630 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
32640 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
32650 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
32660 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
32670 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
32680 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
32690 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
326a0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
326b0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
326c0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
326d0 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
326e0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
326f0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
32700 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
32710 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
32720 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
32730 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
32740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32760 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32770 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
32780 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
32790 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
327a0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
327b0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
327c0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
327d0 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
327e0 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
327f0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
32800 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
32810 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
32820 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
32830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32840 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
32850 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
32860 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
32870 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
32880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32890 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
328a0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
328b0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
328c0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
328d0 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
328e0 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
328f0 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
32900 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
32910 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
32920 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
32930 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
32940 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
32950 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
32960 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
32970 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
32980 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
32990 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
329a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
329b0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
329c0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
329d0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
329e0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
329f0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
32a00 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
32a10 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
32a20 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
32a30 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
32a40 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
32a50 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
32a60 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
32a70 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
32a80 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
32a90 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
32aa0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
32ab0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32ac0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
32ad0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
32ae0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
32af0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
32b00 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
32b10 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
32b20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
32b30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
32b40 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
32b50 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
32b60 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
32b70 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
32b80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
32b90 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
32ba0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32bb0 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
32bc0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
32bd0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
32be0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
32bf0 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
32c00 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
32c10 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
32c20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
32c30 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
32c40 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
32c50 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
32c60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
32c70 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
32c80 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
32c90 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
32ca0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32cb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32cc0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
32cd0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
32ce0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
32cf0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
32d00 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Key;.  }.  if( n
32d10 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
32d20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
32d30 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
32d40 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
32d50 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
32d60 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
32d70 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
32d80 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
32d90 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
32da0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
32db0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
32dc0 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
32dd0 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
32de0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
32df0 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
32e00 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
32e10 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
32e20 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
32e30 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
32e40 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
32e50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
32e60 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
32e70 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
32e80 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
32e90 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
32ea0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
32eb0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
32ec0 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
32ed0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
32ee0 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
32ef0 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
32f00 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
32f10 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
32f20 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
32f30 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
32f40 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
32f50 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
32f60 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
32f70 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
32f80 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
32f90 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
32fa0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
32fb0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
32fc0 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
32fd0 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
32fe0 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
32ff0 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
33000 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
33010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33020 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
33030 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
33040 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
33050 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
33060 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
33070 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
33080 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
33090 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
330a0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
330c0 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
330d0 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
330e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
330f0 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
33100 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
33110 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
33120 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
33130 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
33140 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
33150 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
33160 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
33170 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
33180 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
33190 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
331a0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
331b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
331c0 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66  Header=(int)(inf
331d0 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
331e0 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
331f0 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
33200 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
33210 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
33220 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
33230 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
33240 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
33250 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
33260 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b  Prior == &pCell[
33270 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20  info.iOverflow] 
33280 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
33290 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
332a0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
332b0 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
332c0 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
332d0 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
332e0 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
332f0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
33300 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
33310 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33320 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33330 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
33340 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
33350 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
33360 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33370 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
33380 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
33390 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
333a0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
333b0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
333c0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
333d0 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
333e0 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
333f0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
33400 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33410 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
33420 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33430 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
33440 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
33450 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
33460 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
33470 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
33480 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33490 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
334a0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
334b0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
334c0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
334d0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
334e0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
334f0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
33500 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
33510 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
33520 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
33530 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
33540 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
33550 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
33560 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
33570 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
33580 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
33590 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
335a0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
335b0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
335c0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
335d0 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
335e0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
335f0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
33600 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
33610 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
33620 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
33630 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
33640 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
33650 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
33660 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
33670 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
33680 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33690 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
336a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
336b0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
336c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
336d0 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
336e0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
336f0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
33700 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
33710 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
33720 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
33730 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
33740 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
33750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33770 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
33780 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
33790 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
337a0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
337b0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
337c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
337d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
337e0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
337f0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
33800 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
33810 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
33820 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
33830 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
33840 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
33850 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
33860 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
33870 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
33880 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
33890 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
338a0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
338b0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
338c0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
338d0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
338e0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
338f0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
33900 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
33910 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
33920 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
33930 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
33940 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
33950 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
33960 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
33970 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
33980 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33990 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
339a0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
339b0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
339c0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
339d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
339e0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
339f0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
33a00 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
33a10 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
33a20 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
33a30 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
33a40 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
33a50 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
33a60 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
33a70 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
33a80 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
33a90 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
33aa0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
33ab0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
33ac0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
33ad0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
33ae0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
33af0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
33b00 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
33b10 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
33b20 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
33b30 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
33b40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
33b50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
33b60 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
33b70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33b80 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
33b90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33ba0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
33bb0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
33bc0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
33bd0 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
33be0 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
33bf0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
33c00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
33c10 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
33c20 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
33c30 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
33c40 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
33c50 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
33c60 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
33c70 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
33c80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
33c90 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
33ca0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
33cb0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
33cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
33cd0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
33ce0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
33cf0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
33d00 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
33d10 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
33d20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
33d30 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
33d40 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
33d50 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
33d60 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
33d70 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
33d80 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
33d90 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
33da0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
33db0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
33dc0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
33dd0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
33de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33df0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
33e00 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
33e10 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
33e20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
33e30 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
33e40 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
33e50 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
33e60 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
33e70 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
33e80 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
33e90 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
33ea0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
33eb0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
33ec0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
33ed0 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
33ee0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
33ef0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
33f00 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
33f10 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
33f20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
33f30 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
33f40 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
33f50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
33f60 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
33f70 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
33f80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
33f90 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
33fa0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
33fb0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
33fc0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
33fd0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
33fe0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
33ff0 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
34000 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
34010 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
34020 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
34030 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
34040 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
34050 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
34060 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
34070 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
34080 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
34090 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
340a0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
340b0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
340c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
340d0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
340e0 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
340f0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
34100 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
34110 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34120 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34130 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
34140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34150 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
34160 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
34170 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
34180 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
34190 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
341a0 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
341b0 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
341c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
341d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
341e0 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
341f0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
34200 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
34210 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
34220 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
34230 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
34240 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
34250 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
34260 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34270 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
34280 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34290 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
342a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
342b0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
342c0 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
342d0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
342e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
342f0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
34300 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
34310 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
34320 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
34330 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
34340 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
34350 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
34360 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
34370 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
34380 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
34390 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
343a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
343b0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
343c0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
343d0 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
343e0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
343f0 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
34400 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
34410 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
34420 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
34430 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
34440 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
34450 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
34460 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
34470 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
34480 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
34490 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
344a0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
344b0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
344c0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
344d0 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
344e0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
344f0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
34500 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
34510 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
34520 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
34530 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
34540 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
34550 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
34560 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
34570 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
34580 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
34590 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
345a0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
345b0 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
345c0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
345d0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
345e0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
345f0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
34600 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
34610 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
34620 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
34630 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
34640 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
34650 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
34660 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
34670 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
34680 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ented..*/.static
34690 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
346a0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
346b0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
346c0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
346d0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
346e0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
346f0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
34700 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
34710 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
34720 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
34730 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
34740 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
34750 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
34760 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
34770 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
34780 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
34790 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
347a0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
347b0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
347c0 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
347d0 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
347e0 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
347f0 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
34800 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
34810 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
34820 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
34830 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
34840 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
34850 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
34860 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
34870 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
34880 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
34890 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
348a0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
348b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
348c0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
348d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
348e0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
348f0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
34900 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a  pIns;         /*
34910 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50   The point in pP
34920 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20  age->aCellIdx[] 
34930 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e  where no cell in
34940 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28  serted */..  if(
34950 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
34960 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
34970 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
34980 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
34990 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
349a0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
349b0 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
349c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
349d0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
349e0 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
349f0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
34a00 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
34a10 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
34a20 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
34a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
34a40 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
34a50 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
34a60 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
34a70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
34a80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
34a90 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
34aa0 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
34ab0 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
34ac0 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
34ad0 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
34ae0 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
34af0 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
34b00 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
34b10 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
34b20 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
34b30 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
34b40 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
34b50 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
34b60 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
34b70 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
34b80 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
34b90 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
34ba0 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
34bb0 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
34bc0 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
34bd0 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
34be0 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
34bf0 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
34c00 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
34c10 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
34c20 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
34c30 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
34c40 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
34c50 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
34c60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
34c70 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
34c80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
34c90 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
34ca0 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
34cb0 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
34cc0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
34cd0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
34ce0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
34cf0 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
34d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
34d10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34d20 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
34d30 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
34d40 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69  Page->apOvfl)/si
34d50 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
34d60 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
34d70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20  Page->apOvfl[j] 
34d80 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
34d90 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->aiOvfl[j] = 
34da0 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20  (u16)i;..    /* 
34db0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  When multiple ov
34dc0 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74  erflows occur, t
34dd0 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73  hey are always s
34de0 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e  equential and in
34df0 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f  .    ** sorted o
34e00 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61  rder.  This inva
34e10 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63  riants arise bec
34e20 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76  ause multiple ov
34e30 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20  erflows can.    
34e40 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68  ** only occur wh
34e50 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76  en inserting div
34e60 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
34e70 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
34e80 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61  during.    ** ba
34e90 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65  lancing, and the
34ea0 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64   dividers are ad
34eb0 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65  jacent and sorte
34ec0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  d..    */.    as
34ed0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50  sert( j==0 || pP
34ee0 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d  age->aiOvfl[j-1]
34ef0 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76  <(u16)i ); /* Ov
34f00 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65  erflows in sorte
34f10 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61  d order */.    a
34f20 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69  ssert( j==0 || i
34f30 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  ==pPage->aiOvfl[
34f40 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f  j-1]+1 );   /* O
34f50 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71  verflows are seq
34f60 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c  uential */.  }el
34f70 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
34f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34f90 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
34fa0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
34fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34fc0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
34fd0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
34fe0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
34ff0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35000 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
35010 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
35020 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
35030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64  ;.    assert( &d
35040 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
35050 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61  ffset]==pPage->a
35060 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72  CellIdx );.    r
35070 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
35080 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
35090 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
350a0 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
350b0 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
350c0 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
350d0 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
350e0 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
350f0 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  ng properties.  
35100 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
35110 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ns successfully 
35120 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
35130 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61  dx >= 0 );.    a
35140 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50  ssert( idx >= pP
35150 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  age->cellOffset+
35160 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32  2*pPage->nCell+2
35170 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
35180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
35190 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
351a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
351b0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
351c0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
351d0 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
351e0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c  mcpy(&data[idx],
351f0 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
35200 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
35210 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
35220 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
35230 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  );.    }.    pIn
35240 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  s = pPage->aCell
35250 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d  Idx + i*2;.    m
35260 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70  emmove(pIns+2, p
35270 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  Ins, 2*(pPage->n
35280 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20  Cell - i));.    
35290 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69  put2byte(pIns, i
352a0 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dx);.    pPage->
352b0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20  nCell++;.    /* 
352c0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65  increment the ce
352d0 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ll count */.    
352e0 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67  if( (++data[pPag
352f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29  e->hdrOffset+4])
35300 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65  ==0 ) data[pPage
35310 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b  ->hdrOffset+3]++
35320 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
35330 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
35340 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
35350 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  )==pPage->nCell 
35360 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
35370 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
35380 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
35390 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
353a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
353b0 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
353c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
353d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
353e0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
353f0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
35400 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
35410 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
35420 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
35430 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
35440 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
35450 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
35460 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35470 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c  }.}../*.** A Cel
35480 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f  lArray object co
35490 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f  ntains a cache o
354a0 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73  f pointers and s
354b0 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f  izes for a.** co
354c0 6e 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e  nsecutive sequen
354d0 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74  ce of cells that
354e0 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d   might be held m
354f0 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a  ultiple pages..*
35500 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
35510 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41   CellArray CellA
35520 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c  rray;.struct Cel
35530 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e  lArray {.  int n
35540 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
35550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35560 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
35570 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
35580 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f  pRef;          /
35590 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65  * Reference page
355a0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
355b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
355c0 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
355d0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
355e0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
355f0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
35600 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
35610 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
35620 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
35630 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69  sure the cell si
35640 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b  zes at idx, idx+
35650 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20  1, ..., idx+N-1 
35660 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d  have been.** com
35670 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
35680 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65   void populateCe
35690 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61  llCache(CellArra
356a0 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  y *p, int idx, i
356b0 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
356c0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e   idx>=0 && idx+N
356d0 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  <=p->nCell );.  
356e0 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20  while( N>0 ){.  
356f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
35700 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20  ell[idx]!=0 );. 
35710 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c     if( p->szCell
35720 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [idx]==0 ){.    
35730 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
35740 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
35750 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
35760 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a  ->apCell[idx]);.
35770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35780 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
35790 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _DB ||.         
357a0 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69       p->szCell[i
357b0 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43  dx]==p->pRef->xC
357c0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
357d0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
357e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
357f0 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20  x++;.    N--;.  
35800 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
35810 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
35820 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66  e Nth element of
35830 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a   the cell array.
35840 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
35850 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f  _NOINLINE u16 co
35860 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65  mputeCellSize(Ce
35870 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
35880 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
35890 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
358a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
358b0 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b  >szCell[N]==0 );
358c0 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20  .  p->szCell[N] 
358d0 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
358e0 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
358f0 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72  >apCell[N]);.  r
35900 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b  eturn p->szCell[
35910 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  N];.}.static u16
35920 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
35930 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
35940 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
35950 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
35960 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ll );.  if( p->s
35970 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72  zCell[N] ) retur
35980 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
35990 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65    return compute
359a0 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a  CellSize(p, N);.
359b0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
359c0 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
359d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
359e0 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
359f0 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
35a00 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
35a10 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
35a20 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
35a30 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
35a40 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
35a50 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
35a60 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
35a70 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
35a80 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
35a90 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
35aa0 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
35ab0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
35ac0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
35ad0 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
35ae0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
35af0 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
35b00 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
35b10 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
35b20 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
35b30 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
35b40 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
35b50 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
35b60 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
35b70 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
35b80 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
35b90 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
35ba0 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
35bb0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35bc0 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
35bd0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
35be0 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64  atic int rebuild
35bf0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
35c00 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
35c10 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
35c20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
35c30 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35c50 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
35c60 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
35c70 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
35c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35c90 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
35ca0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
35cb0 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35cd0 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
35ce0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
35cf0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
35d00 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
35d10 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
35d20 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a   header on pPg *
35d30 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
35d40 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
35d50 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
35d60 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
35d70 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e  for pPg */.  con
35d80 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  st int usableSiz
35d90 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
35da0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a  ableSize;.  u8 *
35db0 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
35dc0 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  Data[usableSize]
35dd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
35de0 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d  *pCellptr = pPg-
35df0 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20  >aCellIdx;.  u8 
35e00 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
35e10 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
35e20 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
35e30 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20  .  u8 *pData;.. 
35e40 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61   i = get2byte(&a
35e50 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  Data[hdr+5]);.  
35e60 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c  memcpy(&pTmp[i],
35e70 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62   &aData[i], usab
35e80 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20  leSize - i);..  
35e90 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20  pData = pEnd;.  
35ea0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
35eb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
35ec0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
35ed0 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  ];.    if( pCell
35ee0 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c  >aData && pCell<
35ef0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43  pEnd ){.      pC
35f00 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
35f10 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
35f20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
35f30 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75  zCell[i];.    pu
35f40 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
35f50 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29   (pData - aData)
35f60 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
35f70 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44  += 2;.    if( pD
35f80 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29  ata < pCellptr )
35f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
35fa0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35fb0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
35fc0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
35fd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
35fe0 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43  Cell[i]==pPg->xC
35ff0 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65  ellSize(pPg, pCe
36000 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
36010 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
36020 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50  e( szCell[i]!=pP
36030 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
36040 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a  ,pCell) );.  }..
36050 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46    /* The pPg->nF
36060 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77  ree field is now
36070 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
36080 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
36090 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70  l fix it. */.  p
360a0 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  Pg->nCell = nCel
360b0 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  l;.  pPg->nOverf
360c0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
360d0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
360e0 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79  1], 0);.  put2by
360f0 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
36100 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
36110 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
36120 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
36130 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61   aData);.  aData
36140 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a  [hdr+7] = 0x00;.
36150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36160 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  OK;.}../*.** Arr
36170 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
36180 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
36190 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
361a0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
361b0 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  l.** contains th
361c0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
361d0 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
361e0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
361f0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a   attempts to .**
36200 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73   add the cells s
36210 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72  tored in the arr
36220 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ay to page pPg. 
36230 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65  If it cannot (be
36240 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
36250 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64  ge needs to be d
36260 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
36270 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c  re the cells wil
36280 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f  l fit), non-zero
36290 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
362a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
362b0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64  he cells are add
362c0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
362d0 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75   zero is.** retu
362e0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rned..**.** Argu
362f0 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f  ment pCellptr po
36300 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
36310 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
36320 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
36330 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61  y.** (part of pa
36340 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c  ge pPg) to popul
36350 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20  ate. After cell 
36360 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69  apCell[0] is wri
36370 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70  tten to the.** p
36380 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62  age body, a 16-b
36390 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69  it offset is wri
363a0 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72  tten to pCellptr
363b0 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72  . And so on, for
363c0 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e   each.** cell in
363d0 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69   the array. It i
363e0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
363f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
36400 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  er to ensure.** 
36410 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
36420 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69  to overwrite thi
36430 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65  s part of the ce
36440 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
36450 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
36460 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
36470 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f  lled, *ppData po
36480 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
36490 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  t of the .** con
364a0 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67  tent area on pag
364b0 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69  e pPg. If the si
364c0 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ze of the conten
364d0 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64  t area is extend
364e0 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69  ed,.** *ppData i
364f0 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  s updated to poi
36500 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
36510 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  art of the conte
36520 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72  nt area.** befor
36530 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
36540 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75  ** Finally, argu
36550 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e  ment pBegin poin
36560 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  ts to the byte i
36570 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
36580 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20  wing the.** end 
36590 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71  of the space req
365a0 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61  uired by this pa
365b0 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d  ge for the cell-
365c0 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f  pointer area (fo
365d0 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d  r.** all cells -
365e0 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20   not just those 
365f0 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20  inserted by the 
36600 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49  current call). I
36610 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
36620 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78   area must be ex
36630 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65  tended to before
36640 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
36650 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61  rder to accomoda
36660 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  te all.** cells 
36670 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65  in apCell[], the
36680 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e  n the cells do n
36690 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a  ot fit and non-z
366a0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
366b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
366c0 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
366d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64    /* Page to add
36700 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75   cells to */.  u
36710 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20  8 *pBegin,      
36720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36730 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f  * End of cell-po
36740 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
36750 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20   u8 **ppData,   
36760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36770 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65   /* IN/OUT: Page
36780 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70   content -area p
36790 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
367a0 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20  pCellptr,       
367b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
367c0 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70  ointer to cell-p
367d0 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20  ointer area */. 
367e0 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
367f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36800 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
36810 73 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a  st cell to add *
36820 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
36830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36840 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36850 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
36860 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72   pPg */.  CellAr
36870 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
36880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36890 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29  ay of cells */.)
368a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  {.  int i;.  u8 
368b0 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44  *aData = pPg->aD
368c0 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  ata;.  u8 *pData
368d0 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e   = *ppData;.  in
368e0 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20  t iEnd = iFirst 
368f0 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  + nCell;.  asser
36900 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
36910 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d   pPg->hdrOffset=
36920 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65  =0 );    /* Neve
36930 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  r called on page
36940 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46   1 */.  for(i=iF
36950 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
36960 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20  +){.    int sz, 
36970 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  rc;.    u8 *pSlo
36980 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68  t;.    sz = cach
36990 65 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72  edCellSize(pCArr
369a0 61 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ay, i);.    if( 
369b0 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20  (aData[1]==0 && 
369c0 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20  aData[2]==0) || 
369d0 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e  (pSlot = pageFin
369e0 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63  dSlot(pPg,sz,&rc
369f0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))==0 ){.      p
36a00 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20  Data -= sz;.    
36a10 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67    if( pData<pBeg
36a20 69 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  in ) return 1;. 
36a30 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61       pSlot = pDa
36a40 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ta;.    }.    me
36a50 6d 63 70 79 28 70 53 6c 6f 74 2c 20 70 43 41 72  mcpy(pSlot, pCAr
36a60 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20  ray->apCell[i], 
36a70 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
36a80 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
36a90 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
36aa0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
36ab0 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
36ac0 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
36ad0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
36ae0 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
36af0 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
36b00 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
36b10 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
36b20 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
36b30 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
36b40 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
36b50 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36b60 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
36b70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
36b80 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
36b90 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
36ba0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
36bb0 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
36bc0 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
36bd0 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
36be0 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
36bf0 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
36c00 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
36c10 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
36c20 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
36c30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
36c40 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
36c50 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
36c60 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
36c70 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
36c80 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
36c90 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
36ca0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
36cb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
36cc0 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  edit */.  int iF
36cd0 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
36ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36cf0 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74  st cell to delet
36d00 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
36d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36d20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
36d30 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43  to delete */.  C
36d40 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
36d50 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
36d60 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36d70 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f   */.){.  u8 * co
36d80 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
36d90 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
36da0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
36db0 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  ta[pPg->pBt->usa
36dc0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a  bleSize];.  u8 *
36dd0 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20   const pStart = 
36de0 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f  &aData[pPg->hdrO
36df0 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d  ffset + 8 + pPg-
36e00 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
36e10 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a    int nRet = 0;.
36e20 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
36e30 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e  End = iFirst + n
36e40 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65  Cell;.  u8 *pFre
36e50 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46  e = 0;.  int szF
36e60 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  ree = 0;..  for(
36e70 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
36e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
36e90 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d  pCell = pCArray-
36ea0 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >apCell[i];.    
36eb0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72  if( pCell>=pStar
36ec0 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20  t && pCell<pEnd 
36ed0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  ){.      int sz;
36ee0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65  .      /* No nee
36ef0 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64 43  d to use cachedC
36f00 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20  ellSize() here. 
36f10 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c   The sizes of al
36f20 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20  l cells that.   
36f30 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20     ** are to be 
36f40 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65 61  freed have alrea
36f50 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e  dy been computin
36f60 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67  g while deciding
36f70 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20   which.      ** 
36f80 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69  cells need freei
36f90 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d  ng */.      sz =
36fa0 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c   pCArray->szCell
36fb0 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a  [i];  assert( sz
36fc0 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >0 );.      if( 
36fd0 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20  pFree!=(pCell + 
36fe0 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  sz) ){.        i
36ff0 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
37000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
37010 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46  ree>aData && (pF
37020 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35  ree - aData)<655
37030 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  36 );.          
37040 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28  freeSpace(pPg, (
37050 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61  u16)(pFree - aDa
37060 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20  ta), szFree);.  
37070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37080 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
37090 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20         szFree = 
370a0 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  sz;.        if( 
370b0 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20  pFree+sz>pEnd ) 
370c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
370d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
370e0 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
370f0 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20        szFree += 
37100 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
37110 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a    nRet++;.    }.
37120 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20    }.  if( pFree 
37130 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
37140 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
37150 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
37160 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53  536 );.    freeS
37170 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28  pace(pPg, (u16)(
37180 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20  pFree - aData), 
37190 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  szFree);.  }.  r
371a0 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f  eturn nRet;.}../
371b0 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  *.** apCell[] an
371c0 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  d szCell[] conta
371d0 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
371e0 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  and sizes of all
371f0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a   cells in the.**
37200 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
37210 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72 72  anced.  The curr
37220 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68  ent page, pPg, h
37230 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65  as pPg->nCell ce
37240 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  lls starting.** 
37250 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64  with apCell[iOld
37260 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63  ].  After balanc
37270 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20 73  ing, this page s
37280 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20  hould hold nNew 
37290 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e  cells.** startin
372a0 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77  g at apCell[iNew
372b0 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ]..**.** This ro
372c0 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20  utine makes the 
372d0 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
372e0 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20  ments to pPg so 
372f0 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73  that it contains
37300 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
37310 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e  cells after bein
37320 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  g balanced..**.*
37330 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
37340 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
37350 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
37360 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74  tion returns. It
37370 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f   is the.** respo
37380 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
37390 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
373a0 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
373b0 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 50  static int editP
373c0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
373d0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
373e0 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
373f0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
37400 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  t iOld,         
37410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37420 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
37430 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f  cell currently o
37440 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
37450 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  iNew,           
37460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37470 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73  ndex of new firs
37480 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a  t cell on page *
37490 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20  /.  int nNew,   
374a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374b0 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
374c0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
374d0 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72  page */.  CellAr
374e0 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
374f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37500 61 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64 20  ay of cells and 
37510 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  sizes */.){.  u8
37520 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37530 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63   pPg->aData;.  c
37540 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
37550 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
37560 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70   u8 *pBegin = &p
37570 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65  Pg->aCellIdx[nNe
37580 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43  w * 2];.  int nC
37590 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c  ell = pPg->nCell
375a0 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73  ;       /* Cells
375b0 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a   stored on pPg *
375c0 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20  /.  u8 *pData;. 
375d0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20   u8 *pCellptr;. 
375e0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f   int i;.  int iO
375f0 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70  ldEnd = iOld + p
37600 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d  Pg->nCell + pPg-
37610 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e  >nOverflow;.  in
37620 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77  t iNewEnd = iNew
37630 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66   + nNew;..#ifdef
37640 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
37650 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74  u8 *pTmp = sqlit
37660 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
37670 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65  (pPg->pBt->pPage
37680 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d  r);.  memcpy(pTm
37690 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70  p, aData, pPg->p
376a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
376b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
376c0 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20  move cells from 
376d0 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e  the start and en
376e0 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
376f0 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77  .  if( iOld<iNew
37700 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69   ){.    int nShi
37710 66 74 20 3d 20 70 61 67 65 46 72 65 65 41 72 72  ft = pageFreeArr
37720 61 79 28 70 50 67 2c 20 69 4f 6c 64 2c 20 69 4e  ay(pPg, iOld, iN
37730 65 77 2d 69 4f 6c 64 2c 20 70 43 41 72 72 61 79  ew-iOld, pCArray
37740 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
37750 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70  Pg->aCellIdx, &p
37760 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68  Pg->aCellIdx[nSh
37770 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29  ift*2], nCell*2)
37780 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e  ;.    nCell -= n
37790 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Shift;.  }.  if(
377a0 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45   iNewEnd < iOldE
377b0 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20  nd ){.    nCell 
377c0 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79  -= pageFreeArray
377d0 28 70 50 67 2c 20 69 4e 65 77 45 6e 64 2c 20 69  (pPg, iNewEnd, i
377e0 4f 6c 64 45 6e 64 20 2d 20 69 4e 65 77 45 6e 64  OldEnd - iNewEnd
377f0 2c 20 70 43 41 72 72 61 79 29 3b 0a 20 20 7d 0a  , pCArray);.  }.
37800 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61 74  .  pData = &aDat
37810 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  a[get2byteNotZer
37820 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  o(&aData[hdr+5])
37830 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70  ];.  if( pData<p
37840 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69  Begin ) goto edi
37850 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f  tpage_fail;..  /
37860 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74  * Add cells to t
37870 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
37880 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e  page */.  if( iN
37890 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69  ew<iOld ){.    i
378a0 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e  nt nAdd = MIN(nN
378b0 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20  ew,iOld-iNew);. 
378c0 20 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64     assert( (iOld
378d0 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e  -iNew)<nNew || n
378e0 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55  Cell==0 || CORRU
378f0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65  PT_DB );.    pCe
37900 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
37910 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f  llIdx;.    memmo
37920 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64  ve(&pCellptr[nAd
37930 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20  d*2], pCellptr, 
37940 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66  nCell*2);.    if
37950 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
37960 79 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  y(.          pPg
37970 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
37980 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
37990 20 20 20 20 20 20 69 4e 65 77 2c 20 6e 41 64 64        iNew, nAdd
379a0 2c 20 70 43 41 72 72 61 79 0a 20 20 20 20 29 20  , pCArray.    ) 
379b0 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
379c0 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  fail;.    nCell 
379d0 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20  += nAdd;.  }..  
379e0 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66  /* Add any overf
379f0 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66  low cells */.  f
37a00 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e  or(i=0; i<pPg->n
37a10 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a  Overflow; i++){.
37a20 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20      int iCell = 
37a30 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f  (iOld + pPg->aiO
37a40 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a  vfl[i]) - iNew;.
37a50 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30      if( iCell>=0
37a60 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29   && iCell<nNew )
37a70 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72  {.      pCellptr
37a80 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
37a90 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20  x[iCell * 2];.  
37aa0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65      memmove(&pCe
37ab0 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70  llptr[2], pCellp
37ac0 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65  tr, (nCell - iCe
37ad0 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  ll) * 2);.      
37ae0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69  nCell++;.      i
37af0 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
37b00 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ay(.            
37b10 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
37b20 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
37b30 20 20 20 20 20 20 20 20 20 20 20 69 43 65 6c 6c             iCell
37b40 2b 69 4e 65 77 2c 20 31 2c 20 70 43 41 72 72 61  +iNew, 1, pCArra
37b50 79 0a 20 20 20 20 20 20 29 20 29 20 67 6f 74 6f  y.      ) ) goto
37b60 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
37b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
37b80 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20  Append cells to 
37b90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
37ba0 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74  age */.  pCellpt
37bb0 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
37bc0 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69  dx[nCell*2];.  i
37bd0 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
37be0 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c  ay(.        pPg,
37bf0 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
37c00 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
37c10 20 20 20 69 4e 65 77 2b 6e 43 65 6c 6c 2c 20 6e     iNew+nCell, n
37c20 4e 65 77 2d 6e 43 65 6c 6c 2c 20 70 43 41 72 72  New-nCell, pCArr
37c30 61 79 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64  ay.  ) ) goto ed
37c40 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20  itpage_fail;..  
37c50 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65  pPg->nCell = nNe
37c60 77 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  w;.  pPg->nOverf
37c70 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
37c80 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
37c90 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b  3], pPg->nCell);
37ca0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
37cb0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61  ta[hdr+5], pData
37cc0 20 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64   - aData);..#ifd
37cd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
37ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
37cf0 77 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42  w && !CORRUPT_DB
37d00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
37d10 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d  pCell = pCArray-
37d20 3e 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b  >apCell[i+iNew];
37d30 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
37d40 67 65 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61  get2byte(&pPg->a
37d50 43 65 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20  CellIdx[i*2]);. 
37d60 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44     if( pCell>=aD
37d70 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44  ata && pCell<&aD
37d80 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
37d90 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ableSize] ){.   
37da0 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
37db0 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
37dc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
37dd0 74 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65  t( 0==memcmp(pCe
37de0 6c 6c 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d  ll, &aData[iOff]
37df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
37e00 41 72 72 61 79 2d 3e 70 52 65 66 2d 3e 78 43 65  Array->pRef->xCe
37e10 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2d 3e  llSize(pCArray->
37e20 70 52 65 66 2c 20 70 43 41 72 72 61 79 2d 3e 61  pRef, pCArray->a
37e30 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 29 20  pCell[i+iNew])) 
37e40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
37e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37e60 4b 3b 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69  K;. editpage_fai
37e70 6c 3a 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74  l:.  /* Unable t
37e80 6f 20 65 64 69 74 20 74 68 69 73 20 70 61 67 65  o edit this page
37e90 2e 20 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f  . Rebuild it fro
37ea0 6d 20 73 63 72 61 74 63 68 20 69 6e 73 74 65 61  m scratch instea
37eb0 64 2e 20 2a 2f 0a 20 20 70 6f 70 75 6c 61 74 65  d. */.  populate
37ec0 43 65 6c 6c 43 61 63 68 65 28 70 43 41 72 72 61  CellCache(pCArra
37ed0 79 2c 20 69 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a  y, iNew, nNew);.
37ee0 20 20 72 65 74 75 72 6e 20 72 65 62 75 69 6c 64    return rebuild
37ef0 50 61 67 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20  Page(pPg, nNew, 
37f00 26 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c  &pCArray->apCell
37f10 5b 69 4e 65 77 5d 2c 20 26 70 43 41 72 72 61 79  [iNew], &pCArray
37f20 2d 3e 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 29 3b  ->szCell[iNew]);
37f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
37f40 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
37f50 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
37f60 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
37f70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
37f80 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
37f90 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
37fa0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
37fb0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
37fc0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
37fd0 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
37fe0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
37ff0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
38000 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
38010 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
38020 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
38030 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
38040 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
38050 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
38060 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
38070 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
38080 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
38090 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
380a0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
380b0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
380c0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
380d0 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
380e0 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
380f0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
38100 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
38110 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
38120 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
38130 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
38140 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
38150 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
38160 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
38170 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
38180 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
38190 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
381a0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
381b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
381c0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
381d0 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
381e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
381f0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
38200 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
38210 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
38220 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
38230 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
38240 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
38250 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
38260 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
38270 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
38280 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
38290 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
382a0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
382b0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
382c0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
382d0 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
382e0 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
382f0 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
38300 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
38310 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
38320 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
38330 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
38340 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
38350 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
38360 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
38370 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
38380 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
38390 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
383a0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
383b0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
383c0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
383d0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
383e0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
383f0 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
38400 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
38410 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
38420 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
38430 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** a