/ Hex Artifact Content
Login

Artifact 183d62b37358f95d2ffac796f8491591a3456362:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
66e0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
66f0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
6700: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
6710: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
6720: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6730: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6740: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6750: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6760: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6770: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6780: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6790: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
67a0: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
67b0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
67c0: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
67d0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
67e0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
67f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
6800: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
6810: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
6820: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6830: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6840: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6850: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6860: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6870: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6880: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6890: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
68a0: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
68b0: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
68c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
68d0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
68e0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
68f0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
6900: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
6910: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6920: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6930: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6940: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6950: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6960: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6970: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6980: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6990: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
69a0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
69b0: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
69c0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
69d0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
69e0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
69f0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6a00: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6a10: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6a20: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6a30: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6a40: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6a50: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6a60: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6a70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6a80: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6aa0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6ab0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6ac0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6ad0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6ae0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6af0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6b00: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6b10: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6b20: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6b30: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6b40: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6b50: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6b60: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6b70: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6b80: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6b90: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6ba0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6bb0: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6bc0: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6bd0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6be0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6bf0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6c00: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6c10: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6c20: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6c30: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6c40: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6c50: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6c60: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6c70: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6c80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6c90: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6ca0: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6cb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6cc0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6cd0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6ce0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6cf0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6d00: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6d10: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6d40: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6d50: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6d60: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6d70: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6d80: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6d90: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6da0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6df0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6e00: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6e10: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6e20: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6e30: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6e40: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6e50: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6e60: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6e70: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6e80: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6e90: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6ea0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6eb0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6ec0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6ed0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6ee0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6ef0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6f00: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6f10: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6f20: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6f30: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6f40: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6f50: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6f70: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6f80: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6fa0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
6fb0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
6fc0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
6fd0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
6fe0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
6ff0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7000: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7010: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7020: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7030: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7040: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7050: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7060: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7070: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7080: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7090: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
70a0: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
70b0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
70c0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
70d0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
70e0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
70f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
7100: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
7110: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7120: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7130: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7140: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7150: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7160: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7170: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7180: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7190: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
71a0: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
71b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
71c0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
71d0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
71e0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
71f0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7200: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7210: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7220: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7230: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7240: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7250: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7260: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7270: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7280: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7290: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
72a0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
72b0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
72c0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
72d0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
72e0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
72f0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7300: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7310: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7320: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7330: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7340: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7350: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7360: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7370: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7380: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7390: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
73a0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
73b0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
73c0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
73d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
73e0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
73f0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7400: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7410: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7420: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7430: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7440: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7450: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7460: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7470: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7480: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7490: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
74a0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
74b0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
74c0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
74d0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
74e0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
74f0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
7500: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
7510: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7520: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7530: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7540: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7550: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7560: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7570: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7580: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7590: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
75a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
75b0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
75c0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
75d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
75e0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
75f0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7600: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
7610: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
7620: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7630: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7640: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7650: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7660: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7670: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7680: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7690: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
76a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
76b0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
76c0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
76d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
76e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
76f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7700: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7710: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7720: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7730: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7740: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7750: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7760: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7780: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7790: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
77a0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
77b0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
77c0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
77d0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
77e0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
77f0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
7800: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
7810: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7820: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7830: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7840: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7850: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7860: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7870: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7880: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7890: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
78a0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
78b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
78c0: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
78d0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
78e0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
78f0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
7900: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
7910: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
7920: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7930: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7940: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7950: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7960: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7970: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7980: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7990: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
79a0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
79b0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
79c0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
79d0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
79e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
79f0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7a00: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7a10: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7a20: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7a30: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7a40: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7a50: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7a60: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7a70: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7a80: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7a90: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7aa0: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7ab0: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7ac0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7ad0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7ae0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7af0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7b00: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7b10: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7b20: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7b30: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7b40: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7b50: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7b60: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7b70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7b80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7b90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7ba0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7bb0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7bc0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7bd0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7be0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7bf0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7c00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7c10: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7c20: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7c30: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7c40: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7c60: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7c70: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7c80: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7c90: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7ca0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7cb0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7cc0: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7cd0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7ce0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7cf0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7d00: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7d10: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7d20: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7d30: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7d40: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7d50: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7d60: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7d70: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7d80: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7d90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7db0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7dc0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7dd0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7de0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7df0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7e00: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7e10: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7e20: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7e30: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7e40: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7e50: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7e60: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7e70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7e80: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7e90: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7ea0: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7eb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7ec0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7ed0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7ee0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7ef0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7f00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7f10: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7f20: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
7f30: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
7f40: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
7f50: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
7f60: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
7f70: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
7f80: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
7f90: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
7fa0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7fb0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
7fc0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
7fd0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
7ff0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
8000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8010: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8020: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8030: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8040: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8050: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8060: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8070: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8080: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8090: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
80a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
80b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
80c0: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
80d0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
80e0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
80f0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
8100: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
8110: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8120: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8130: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8140: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8150: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8160: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8170: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8180: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8190: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
81a0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
81b0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
81c0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
81d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
81e0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
81f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8200: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
8210: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
8220: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8230: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8240: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8250: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8260: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8270: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8280: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8290: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
82a0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
82b0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
82c0: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
82d0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
82e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
82f0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
8300: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
8310: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
8320: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8330: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8340: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8350: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8360: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8370: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8380: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8390: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
83a0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
83b0: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
83c0: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
83d0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
83e0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
83f0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
8400: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
8410: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8420: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8430: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8440: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8450: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8460: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8470: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8480: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8490: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
84a0: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
84b0: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
84c0: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
84d0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
84e0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
84f0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
8500: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
8510: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8520: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8530: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8540: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8550: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8560: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8570: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8580: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8590: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
85a0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
85b0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
85c0: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
85d0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
85e0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
85f0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8600: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
8610: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
8620: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8630: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8660: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8670: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8680: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8690: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
86a0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
86b0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
86c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
86d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
86e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
86f0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8700: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8710: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
8720: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8730: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8740: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8750: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8760: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8770: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8780: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8790: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
87a0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
87b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
87c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
87d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
87e0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8800: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
8810: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
8820: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8830: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8840: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8850: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8860: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8870: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8880: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8890: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
88a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
88b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
88c0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
88d0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
88e0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
88f0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
8900: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
8910: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
8920: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8930: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8940: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8950: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8960: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8970: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8980: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8990: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
89a0: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
89b0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
89c0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
89d0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
89e0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
89f0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8a00: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8a10: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a40: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8a50: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8a60: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8a90: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8aa0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8ab0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8ac0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8ae0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8af0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8b00: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8b10: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8b20: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8b30: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8b40: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8b50: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8b60: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8b70: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8b80: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8b90: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8ba0: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8bb0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8bc0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8bd0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8be0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8bf0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8c00: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8c10: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8c20: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8c30: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8c40: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8c50: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8c60: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8c70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8c80: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8c90: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8ca0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8cb0: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8cc0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8cd0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8ce0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8cf0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8d00: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8d10: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8d20: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8d30: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8d40: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8d50: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8d60: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8d70: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8d80: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8d90: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8da0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8db0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8dc0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8dd0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8de0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8df0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8e00: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8e10: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8e20: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8e30: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8e40: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8e50: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8e60: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8e70: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8e80: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8e90: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8ea0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8eb0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8ec0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8ed0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8ee0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8ef0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8f00: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8f10: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8f20: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
8f30: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
8f40: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
8f50: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
8f60: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8f70: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
8f80: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
8f90: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
8fa0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8fb0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8fc0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8fd0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
8fe0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8ff0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9000: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9010: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9020: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9030: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9040: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9050: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9060: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9070: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9080: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9090: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
90a0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
90b0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
90c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
90d0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
90e0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
90f0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
9100: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
9110: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
9120: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9130: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9140: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9150: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9160: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9170: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9180: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9190: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
91a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
91b0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
91c0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
91d0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
91e0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
91f0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9200: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
9210: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
9220: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9230: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9240: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9260: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9270: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9280: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9290: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
92a0: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
92b0: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
92c0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
92d0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
92e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
92f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
9300: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
9310: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
9320: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9330: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9340: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9350: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9360: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9370: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9380: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9390: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
93a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
93b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
93c0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
93d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
93e0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
93f0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
9400: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
9410: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
9420: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9430: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9440: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9450: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9460: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9470: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
9480: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
9490: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
94a0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
94d0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
94e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
94f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9500: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
9510: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
9540: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
9550: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
9580: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
9590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
95a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
95b0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
95c0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
95d0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
95e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
95f0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
9600: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
9610: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
9620: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9630: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
9640: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9650: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
9660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9670: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
9680: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
9690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
96a0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
96b0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
96c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
96d0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
96e0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
96f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
9700: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
9710: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
9720: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
9730: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
9740: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
9750: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
9760: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
9770: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
9780: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9790: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
97a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
97b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
97c0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
97d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
97e0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
97f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9800: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9810: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
9820: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9830: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9840: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9850: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
9860: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
9870: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
9880: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
9890: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
98a0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
98b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
98c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
98d0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
98e0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
98f0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9900: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9910: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9920: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9930: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9940: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
9950: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9960: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
9970: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
9980: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
9990: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
99a0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
99b0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
99c0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
99d0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
99e0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
99f0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
9a00: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
9a10: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
9a20: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
9a30: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
9a40: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
9a50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
9a60: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
9a70: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
9a80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
9a90: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
9aa0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
9ab0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
9ac0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9ad0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9ae0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9af0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9b00: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9b10: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9b20: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9b30: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9b40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9b50: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9b60: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9b70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
9b80: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
9b90: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
9ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9bb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9bc0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9bd0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
9be0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9bf0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9c00: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9c10: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9c20: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9c30: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9c40: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c50: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c60: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9c70: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
9c80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9c90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9ca0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
9cb0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9cc0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
9cd0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9d00: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9d10: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9d20: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9d30: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9d40: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9d50: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9d60: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9d70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9d80: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
9d90: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
9da0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
9db0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
9dc0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
9dd0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9de0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9df0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9e00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9e10: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9e20: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9e30: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9e40: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9e50: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9e60: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9e70: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
9e80: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
9e90: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9ea0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9eb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
9ec0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
9ed0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9ee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9ef0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9f00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9f10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9f20: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9f30: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9f40: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9f50: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9f60: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9f70: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9f80: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9f90: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9fa0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9fb0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9fc0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9fd0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9fe0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9ff0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
a000: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
a010: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
a020: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
a030: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
a040: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
a050: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
a060: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
a070: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
a080: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
a090: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
a0a0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
a0b0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
a0c0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
a0d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
a0e0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
a0f0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
a100: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
a110: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
a120: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
a130: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
a140: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
a150: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
a160: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
a170: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
a180: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
a190: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
a1a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
a1b0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
a1c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
a1d0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
a1e0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
a1f0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
a200: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
a210: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
a220: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
a230: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
a240: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
a250: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
a260: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
a270: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
a280: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a2b0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
a2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
a2d0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
a2e0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
a2f0: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
a300: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
a310: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
a320: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
a330: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
a340: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
a350: 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
a360: 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68  sable size of th
a370: 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61  e page */.  .  a
a380: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a390: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a3a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a3b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a3c0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
a3d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a3e0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a3f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a400: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
a410: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
a420: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
a430: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a440: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
a450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a460: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
a470: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
a480: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
a490: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  ableSize;.  asse
a4a0: 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62  rt( nByte < usab
a4b0: 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 61  leSize-8 );..  a
a4c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
a4d0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
a4e0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
a4f0: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
a500: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
a510: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
a520: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
a530: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 74 6f  p<=65536 );.  to
a540: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
a550: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
a560: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
a570: 20 69 66 28 20 74 6f 70 3d 3d 30 20 29 7b 0a 20   if( top==0 ){. 
a580: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
a590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a5a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a5b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a5c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
a5d0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
a5e0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
a5f0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
a600: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
a610: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
a620: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
a630: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
a640: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
a650: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
a660: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
a670: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
a680: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
a690: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
a6a0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
a6b0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
a6c0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
a6d0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
a6e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
a6f0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
a700: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20 28   gap+2<=top && (
a710: 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20 64  data[hdr+1] || d
a720: 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a 20  ata[hdr+2]) ){. 
a730: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
a740: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
a750: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
a760: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
a770: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
a780: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20       int size;  
a790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a7a0: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a7b0: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
a7c0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
a7d0: 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a  || pc<addr+4 ){.
a7e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a7f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a800: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
a810: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
a820: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
a830: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
a840: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a850: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a860: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74  nByte;.        t
a870: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a880: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a890: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
a8a0: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
a8b0: 20 20 20 20 20 20 20 20 69 66 28 20 64 61 74 61          if( data
a8c0: 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29 20 67 6f  [hdr+7]>=60 ) go
a8d0: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  to defragment_pa
a8e0: 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;.          /*
a8f0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
a900: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
a910: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
a920: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
a930: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
a940: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
a950: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
a960: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
a970: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
a980: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
a990: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b     data[hdr+7] +
a9a0: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 20  = (u8)x;.       
a9b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b   }else if( size+
a9c0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
a9d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a9f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
aa00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
aa10: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
aa20: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
aa30: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
aa40: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
aa50: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
aa60: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
aa70: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa80: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa90: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
aaa0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
aab0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
aac0: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
aad0: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
aae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
aaf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ab00: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
ab10: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
ab20: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
ab30: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
ab40: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
ab50: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
ab60: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
ab70: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
ab80: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
ab90: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
aba0: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
abb0: 29 7b 0a 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  ){.defragment_pa
abc0: 67 65 3a 0a 20 20 20 20 74 65 73 74 63 61 73 65  ge:.    testcase
abd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
abe0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  0 );.    rc = de
abf0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
ac00: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
ac10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
ac20: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
ac30: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
ac40: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
ac50: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
ac60: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
ac70: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
ac80: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
ac90: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
aca0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
acb0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
acc0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
acd0: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
ace0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
acf0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
ad00: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
ad10: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
ad20: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
ad30: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
ad40: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
ad50: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
ad60: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
ad70: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ad80: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
ad90: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
ada0: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
adb0: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
adc0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
add0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ade0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
adf0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
ae00: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
ae10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ae20: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
ae30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ae40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
ae50: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
ae60: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
ae70: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
ae80: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
ae90: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
aea0: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
aeb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
aec0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
aed0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
aee0: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
aef0: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
af00: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
af10: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
af20: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
af30: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
af40: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
af50: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
af60: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
af70: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
af80: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
af90: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
afa0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
afb0: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
afc0: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
afd0: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
afe0: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
aff0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
b000: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
b010: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
b020: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
b030: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
b040: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
b050: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
b060: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
b070: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
b080: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
b090: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
b0a0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
b0b0: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
b0c0: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
b0d0: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b100: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
b110: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
b120: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b150: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
b160: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b190: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
b1a0: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
b1b0: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
b1e0: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
b1f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
b200: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
b210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b220: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
b230: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
b240: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
b250: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b260: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
b270: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
b280: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b290: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
b2a0: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
b2b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b2c0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
b2d0: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
b2e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b2f0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b300: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
b310: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
b320: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b330: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b340: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b350: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b360: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b370: 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50 61  ert( iStart>=pPa
b380: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
b390: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b3a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
b3b0: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
b3c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b3e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b3f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b400: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b410: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
b420: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
b430: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
b440: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
b450: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
b460: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
b470: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
b480: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
b490: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
b4a0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
b4b0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
b4c0: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
b4d0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
b4e0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
b4f0: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
b500: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
b510: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
b520: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
b530: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
b540: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
b550: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
b560: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
b570: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
b580: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
b590: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b5a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
b5b0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
b5c0: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
b5d0: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
b5e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
b5f0: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
b600: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
b610: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
b620: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
b630: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
b640: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
b650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b660: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
b670: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
b680: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
b690: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
b6a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b6b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
b6c0: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
b6d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
b6e0: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
b6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b700: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
b710: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
b720: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
b730: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
b740: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
b750: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
b760: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
b770: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
b780: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
b790: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
b7a0: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
b7b0: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
b7c0: 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  r iFreeBlk.    *
b7d0: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
b7e0: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
b7f0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
b800: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
b810: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
b820: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
b830: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
b840: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
b850: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
b860: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
b870: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
b880: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
b890: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b8a0: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
b8b0: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
b8c0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
b8d0: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69  k+2]);.      iSi
b8e0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
b8f0: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
b900: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
b910: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
b920: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b930: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
b940: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
b950: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
b960: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
b970: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
b980: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
b990: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
b9a0: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
b9b0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
b9c0: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
b9d0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
b9e0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
b9f0: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
ba00: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
ba10: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
ba20: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
ba30: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
ba40: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
ba50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
ba60: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
ba70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ba80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ba90: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
baa0: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
bab0: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
bac0: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
bad0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
bae0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
baf0: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
bb00: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
bb10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
bb20: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
bb30: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
bb40: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
bb50: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
bb60: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
bb70: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
bb80: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
bb90: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
bba0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
bbb0: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
bbc0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
bbd0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
bbe0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
bbf0: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
bc00: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
bc10: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
bc20: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
bc30: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bc40: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
bc50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bc60: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
bc70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bc80: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
bc90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
bca0: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
bcb0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
bcc0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
bcd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bce0: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
bcf0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
bd00: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
bd10: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
bd20: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
bd30: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
bd40: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
bd50: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
bd60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
bd70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
bd80: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
bd90: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
bda0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
bdb0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
bdc0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
bdd0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
bde0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
bdf0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
be00: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
be10: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
be20: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
be30: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
be40: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
be50: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
be60: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
be70: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
be80: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
be90: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
bea0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
beb0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
bec0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
bed0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
bee0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
bef0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
bf00: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
bf10: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
bf20: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
bf30: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
bf40: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
bf50: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
bf60: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
bf70: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
bf80: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
bf90: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
bfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bfb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bfc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bfd0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
bfe0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
bff0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
c000: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
c010: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
c020: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
c030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
c040: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
c050: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
c060: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
c070: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
c080: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
c090: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
c0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
c0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c0c0: 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e  eyLeaf = pPage->
c0d0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
c0e0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50  >noPayload = !pP
c0f0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
c100: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
c110: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
c120: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
c130: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
c140: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
c150: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
c160: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
c170: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
c180: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
c190: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
c1a0: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
c1b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
c1c0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
c1d0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
c1e0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
c1f0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
c200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
c210: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c220: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
c230: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
c240: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
c250: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
c260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c280: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
c290: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
c2a0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
c2b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
c2c0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c2d0: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
c2e0: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
c2f0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
c300: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
c310: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
c320: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
c330: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
c340: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
c350: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
c360: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
c370: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
c380: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
c390: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
c3a0: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
c3b0: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
c3c0: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
c3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c3e0: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
c3f0: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
c400: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c410: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c420: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c430: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c440: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
c450: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
c460: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
c470: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
c480: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c490: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
c4a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c4b0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c4c0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c4d0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
c4e0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c4f0: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c500: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
c510: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c520: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
c530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
c540: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
c550: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
c560: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
c570: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
c580: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
c590: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
c5a0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
c5b0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
c5c0: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
c5d0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
c5e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
c600: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
c610: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
c620: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
c630: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
c640: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
c650: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
c660: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
c670: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
c680: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
c690: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
c6a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
c6b0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
c6c0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
c6d0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
c6e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
c6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c700: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c710: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
c720: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
c730: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
c740: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
c750: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
c760: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
c770: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
c780: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
c790: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
c7a0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
c7b0: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
c7c0: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
c7d0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c7e0: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
c7f0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
c800: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
c810: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
c820: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
c830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c840: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
c850: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c860: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c870: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
c880: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
c890: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
c8a0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
c8b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
c8c0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
c8d0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
c8e0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
c8f0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
c900: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
c910: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
c920: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
c930: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
c940: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
c950: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
c960: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
c970: 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d  fset];.    top =
c980: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
c990: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c9a0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
c9b0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c9c0: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
c9d0: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
c9e0: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
c9f0: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
ca00: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
ca10: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
ca20: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
ca30: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
ca40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
ca60: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
ca70: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
ca80: 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  LL(pBt) );..    
ca90: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
caa0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
cab0: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
cac0: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
cad0: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
cae0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
caf0: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
cb00: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
cb10: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
cb20: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
cb30: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
cb40: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
cb50: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
cb60: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
cb70: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
cb80: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
cb90: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
cba0: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
cbb0: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
cbc0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
cbd0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
cbe0: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
cbf0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
cc00: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
cc10: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
cc20: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
cc30: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
cc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cc50: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
cc60: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
cc70: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
cc80: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
cc90: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
cca0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
ccb0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ccc0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
ccd0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
cce0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
ccf0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
cd00: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
cd10: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
cd20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
cd30: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
cd40: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
cd50: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
cd60: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
cd70: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
cd80: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
cd90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
cda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cdb0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
cdc0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
cdd0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
cde0: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
cdf0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
ce00: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
ce10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
ce20: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
ce30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
ce40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ce50: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
ce60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ce70: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
ce80: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
ce90: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
cea0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
ceb0: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
cec0: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
ced0: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
cee0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
cef0: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
cf00: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
cf10: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
cf20: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
cf30: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
cf40: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
cf50: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
cf60: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
cf70: 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65  /* Start of free
cf80: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
cf90: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
cfa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cfb0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
cfc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
cfd0: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
cfe0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
cff0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
d000: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
d010: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
d020: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
d030: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
d040: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
d050: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
d060: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
d070: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
d080: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
d090: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
d0a0: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
d0b0: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
d0c0: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
d0d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d0e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d0f0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
d100: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
d110: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
d120: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
d130: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d140: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
d150: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
d160: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
d170: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
d180: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
d190: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
d1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
d1b0: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
d1c0: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
d1d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
d1e0: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
d1f0: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
d200: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
d210: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
d220: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
d230: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
d240: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
d250: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
d260: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
d270: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
d280: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
d290: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
d2a0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
d2b0: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
d2c0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d2d0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
d2e0: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
d2f0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
d300: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d310: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
d320: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
d330: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
d340: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
d350: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d360: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
d370: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d380: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
d390: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
d3a0: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
d3b0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
d3c0: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
d3d0: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
d3e0: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
d3f0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
d400: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
d410: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
d420: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
d430: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d440: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
d450: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
d460: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
d470: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
d480: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d490: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
d4a0: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
d4b0: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d4d0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
d4e0: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
d4f0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
d500: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d510: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
d520: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
d530: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d540: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d550: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d560: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d570: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d580: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d590: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
d5a0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
d5b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
d5c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
d5d0: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
d5e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
d5f0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
d600: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
d610: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
d620: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
d630: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
d640: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
d650: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
d660: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
d670: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
d680: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
d690: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
d6a0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
d6b0: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
d6c0: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
d6d0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
d6e0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
d6f0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
d700: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
d710: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
d720: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
d730: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
d740: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
d750: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
d760: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d770: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
d780: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
d790: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
d7a0: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
d7b0: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d7c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d7d0: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
d7e0: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
d7f0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
d800: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
d810: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
d820: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d830: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
d840: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
d850: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
d860: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
d870: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
d880: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
d890: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
d8a0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d8b0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
d8c0: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
d8d0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d8e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
d8f0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
d900: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d910: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
d920: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
d930: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
d940: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
d950: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
d960: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d970: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
d980: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
d990: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
d9a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d9b0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d9c0: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
d9d0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
d9e0: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
d9f0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
da00: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
da10: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
da20: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
da30: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
da40: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
da50: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
da60: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
da70: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
da80: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
da90: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
daa0: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
dab0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
dac0: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
dad0: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
dae0: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
daf0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
db00: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
db10: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
db20: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
db30: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
db40: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
db50: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
db60: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
db70: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
db80: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
db90: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
dba0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
dbb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
dbc0: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
dbd0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
dbe0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
dbf0: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
dc00: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
dc10: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
dc20: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
dc30: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
dc40: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
dc50: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
dc60: 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
dc70: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
dc80: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
dc90: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
dca0: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
dcb0: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
dcc0: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
dcd0: 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
dce0: 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
dcf0: 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
dd00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dd10: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
dd20: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
dd30: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
dd40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
dd50: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
dd60: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
dd70: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
dd80: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
dd90: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
dda0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
ddb0: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
ddc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ddd0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
dde0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
ddf0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
de00: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
de10: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
de20: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
de30: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
de40: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
de50: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
de60: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
de70: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
de80: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
de90: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
dea0: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
deb0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
dec0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
ded0: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
dee0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
def0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
df00: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
df10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
df20: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
df30: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
df40: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
df50: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
df60: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
df70: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
df80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
df90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
dfa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
dfb0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
dfc0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
dfd0: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
dfe0: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
dff0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
e000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
e010: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
e020: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
e030: 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
e040: 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
e050: 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
e060: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
e070: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
e080: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
e090: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
e0a0: 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
e0b0: 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
e0c0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
e0d0: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
e0e0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
e0f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
e100: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
e110: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
e120: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
e130: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
e140: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
e150: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
e160: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
e170: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
e180: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
e190: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e1a0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
e1b0: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
e1c0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
e1d0: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
e1e0: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
e1f0: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
e200: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
e210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e220: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
e230: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e260: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
e270: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e290: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
e2a0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
e2b0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e2d0: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
e2e0: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
e2f0: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
e320: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
e330: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
e340: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e350: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e360: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e370: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
e380: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
e390: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
e3a0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
e3b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
e3c0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
e3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e3e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
e3f0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
e400: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
e410: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
e420: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e430: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
e440: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
e450: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
e460: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
e470: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
e480: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e490: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
e4a0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
e4b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
e4c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
e4d0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
e4e0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
e4f0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
e500: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e510: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
e520: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
e530: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
e540: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
e550: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
e560: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
e570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
e580: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
e590: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
e5a0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
e5b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
e5c0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
e5d0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
e5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e5f0: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
e600: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
e610: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
e620: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
e630: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
e640: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
e650: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
e660: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e670: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
e680: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
e690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e6a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e6b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
e6c0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
e6d0: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
e6e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
e6f0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
e700: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
e710: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
e720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
e730: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
e740: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
e750: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
e760: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
e770: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
e780: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
e790: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
e7a0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
e7b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e7c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
e7d0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
e7e0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
e7f0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
e800: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e810: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
e820: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
e830: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
e840: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
e850: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
e860: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
e870: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
e880: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
e890: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
e8a0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
e8b0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
e8c0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
e8d0: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
e8e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e8f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e900: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e910: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e920: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
e930: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
e940: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
e950: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
e960: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
e970: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
e980: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
e990: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
e9a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
e9b0: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
e9c0: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
e9d0: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
e9e0: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
e9f0: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
ea00: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
ea10: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
ea20: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
ea30: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
ea40: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
ea50: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
ea60: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
ea70: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
ea80: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
ea90: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
eaa0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
eab0: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
eac0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
ead0: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
eae0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
eaf0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
eb00: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
eb10: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
eb20: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
eb30: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
eb40: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
eb50: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
eb60: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
eb70: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
eb80: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
eb90: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
eba0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
ebb0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
ebc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ebd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ebe0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
ebf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
ec00: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ec10: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
ec20: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
ec30: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
ec40: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
ec50: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
ec60: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
ec70: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
ec80: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
ec90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
eca0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ecb0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
ecc0: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
ecd0: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
ece0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
ecf0: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
ed00: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
ed10: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
ed20: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
ed30: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
ed40: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
ed50: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
ed60: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
ed70: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ed80: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
ed90: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
eda0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
edb0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
edc0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
edd0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
ede0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
edf0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
ee00: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
ee10: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
ee20: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
ee30: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
ee40: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
ee50: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
ee60: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
ee70: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
ee80: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
ee90: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
eea0: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
eeb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
eec0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
eed0: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
eee0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
eef0: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
ef00: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
ef10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
ef20: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
ef30: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
ef40: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
ef50: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
ef60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
ef70: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
ef80: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
ef90: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
efa0: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
efb0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
efc0: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
efd0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
efe0: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
eff0: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
f000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f010: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
f020: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
f030: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
f040: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
f050: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f060: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
f070: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
f080: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
f090: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
f0a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f0b0: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
f0c0: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
f0d0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0f0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
f100: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
f110: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
f120: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
f130: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
f140: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
f150: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
f160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
f170: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
f180: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
f190: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
f1c0: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
f1d0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
f1e0: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
f1f0: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
f200: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
f210: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
f220: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f230: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f240: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
f250: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
f260: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f280: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
f290: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
f2a0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
f2b0: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
f2c0: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
f2d0: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
f2e0: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
f2f0: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
f300: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
f310: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
f320: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
f330: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
f340: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
f350: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
f360: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
f370: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
f380: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
f390: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
f3a0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
f3b0: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
f3c0: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
f3d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f3e0: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
f3f0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
f400: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
f410: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
f420: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
f430: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
f440: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
f470: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
f480: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
f4b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
f4c0: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
f4d0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
f4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
f4f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f500: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f510: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
f520: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
f530: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
f540: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
f550: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
f560: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
f570: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
f580: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
f590: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
f5a0: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
f5b0: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
f5c0: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
f5d0: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
f5e0: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
f5f0: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
f600: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
f610: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
f620: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
f630: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
f640: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
f650: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
f660: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
f670: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
f680: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
f690: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
f6a0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
f6b0: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
f6c0: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
f6d0: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
f6e0: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
f6f0: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
f700: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
f710: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
f720: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
f730: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
f740: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
f750: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f770: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
f780: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
f790: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
f7a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
f7b0: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
f7c0: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
f7d0: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
f7e0: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
f7f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f800: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f810: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f820: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f830: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
f840: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
f850: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
f860: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
f870: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
f880: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
f890: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
f8a0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
f8b0: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
f8c0: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
f8d0: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
f8e0: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
f8f0: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
f900: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
f910: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
f920: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
f930: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
f940: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
f950: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
f960: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
f970: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
f980: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
f990: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
f9a0: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
f9b0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f9c0: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
f9d0: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f9e0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
f9f0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
fa00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
fa10: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
fa20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
fa40: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
fa50: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
fa60: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
fa70: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
fa80: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
fa90: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
faa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
fab0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
fac0: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
fad0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
fb00: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
fb10: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
fb20: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
fb30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fb40: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
fb50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fb60: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
fb70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb90: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
fba0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
fbb0: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
fbc0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
fbd0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
fbe0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
fbf0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
fc00: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
fc10: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
fc20: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
fc30: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
fc40: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
fc50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
fc60: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
fc70: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
fc80: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
fc90: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
fca0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
fcb0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
fcc0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
fcd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
fce0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
fcf0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
fd00: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
fd10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
fd20: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
fd30: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
fd40: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
fd50: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
fd60: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
fd70: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fd80: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
fd90: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
fda0: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
fdc0: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
fdd0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
fde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
fdf0: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
fe00: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
fe10: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
fe20: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fe30: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
fe40: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
fe50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fe60: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
fe70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
fe80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
fe90: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
feb0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
fed0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
fee0: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
fef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
ff00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
ff10: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
ff20: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
ff30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ff40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff50: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
ff60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ff70: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ff80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
ff90: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ffa0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
ffb0: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
ffc0: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
ffd0: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
ffe0: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
fff0: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
10000 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
10010 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
10020 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
10030 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
10040 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
10050 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
10060 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
10070 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
10080 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
10090 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
100a0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
100b0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
100c0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
100d0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
100e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
100f0 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
10100 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
10110 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10120 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
10130 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
10140 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
10150 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
10160 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
10170 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
10180 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
10190 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
101a0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
101b0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
101c0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
101d0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
101e0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
101f0 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10200 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
10210 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10220 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10230 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
10240 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
10250 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
10260 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
10270 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
10280 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
10290 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
102a0 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
102b0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
102c0 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
102d0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
102e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
102f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
10300 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10310 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10320 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
10330 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
10340 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
10370 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
10380 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
10390 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
103a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
103b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
103c0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
103d0 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
103e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
103f0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
10400 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
10410 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
10420 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
10430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10450 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
10460 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10470 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
10480 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
10490 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
104a0 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
104b0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
104c0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
104d0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
104e0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
104f0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
10500 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
10510 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
10520 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10530 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10540 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
10550 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
10560 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10570 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
10580 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
10590 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
105a0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
105b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
105c0 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
105d0 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
105e0 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
105f0 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
10600 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
10610 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
10620 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
10630 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10640 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
10650 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
10660 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
10670 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
10680 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
10690 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
106a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
106b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
106c0 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
106d0 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
106e0 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
106f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
10700 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
10710 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
10720 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
10730 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
10740 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
10750 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
10760 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
10770 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10780 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
10790 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
107a0 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
107b0 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
107c0 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
107d0 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
107e0 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
107f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
10800 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
10810 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
10820 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10830 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10840 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
10850 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
10860 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
10870 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10880 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
10890 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
108a0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
108b0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
108c0 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
108d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
108e0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
108f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10900 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
10910 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
10920 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
10930 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
10940 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
10950 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10960 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
10970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10980 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
10990 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
109a0 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
109b0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
109c0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
109d0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
109e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
109f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10a00 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10a10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
10a20 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
10a30 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
10a40 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
10a50 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
10a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
10a70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
10a80 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
10a90 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
10aa0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
10ab0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
10ac0 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
10ad0 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
10ae0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10af0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10b00 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10b10 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10b20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
10b30 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
10b40 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
10b50 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
10b60 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
10b70 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
10b80 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
10b90 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
10ba0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
10bb0 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
10bc0 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
10bd0 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
10be0 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10bf0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10c00 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10c10 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
10c20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10c30 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
10c40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
10c50 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
10c60 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
10c70 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
10c80 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10c90 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
10ca0 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
10cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10cd0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
10ce0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
10cf0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
10d00 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10d10 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
10d20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10d30 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
10d40 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
10d50 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
10d60 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10d70 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10d80 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
10d90 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10da0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10db0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
10dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10dd0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
10de0 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
10df0 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
10e00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10e10 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
10e20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
10e30 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
10e40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
10e50 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
10e60 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
10e70 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
10e80 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
10e90 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
10ea0 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
10eb0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
10ec0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
10ed0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
10ee0 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
10ef0 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
10f00 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
10f10 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
10f20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
10f30 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
10f40 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10f50 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
10f60 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
10f70 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
10f80 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
10f90 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
10fa0 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
10fb0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
10fc0 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
10fd0 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
10fe0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10ff0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
11000 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
11010 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
11020 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
11030 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
11040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
11050 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
11060 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
11070 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
11080 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
11090 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
110a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
110b0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
110c0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
110d0 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
110e0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
110f0 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
11100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11110 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
11120 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
11130 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
11140 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
11150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
11160 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11170 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
11180 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
11190 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
111a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
111b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
111c0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
111d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
111e0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
111f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
11200 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11210 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
11220 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
11230 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
11240 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
11250 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
11260 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
11270 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
11280 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
11290 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
112a0 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
112b0 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
112c0 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
112d0 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
112e0 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
112f0 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
11300 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
11310 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
11320 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
11330 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
11340 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
11350 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
11360 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
11370 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
11380 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
11390 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
113a0 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
113b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
113c0 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
113d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
113e0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
113f0 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
11400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11410 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
11420 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
11430 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
11440 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
11450 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
11460 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
11470 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
11480 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
11490 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
114a0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
114b0 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
114c0 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
114d0 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
114e0 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
114f0 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
11500 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11510 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11530 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11540 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
11550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
11560 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
11570 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
11580 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
11590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
115a0 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
115b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
115c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
115d0 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
115e0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
115f0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
11600 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
11610 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11620 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
11630 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
11640 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
11650 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
11660 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11670 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
11680 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
11690 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
116a0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
116b0 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
116c0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
116d0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
116e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
116f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11700 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
11710 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
11720 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
11730 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
11740 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
11750 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11760 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
11770 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
11780 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
11790 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
117a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
117b0 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
117c0 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
117d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
117e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
117f0 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
11800 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
11810 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
11820 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11830 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
11840 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11850 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
11860 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
11870 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
11880 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
11890 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
118a0 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
118b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
118c0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
118d0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
118e0 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
118f0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
11900 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
11910 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
11920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
11930 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
11940 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
11950 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
11960 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
11970 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
11980 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
11990 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
119a0 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
119b0 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
119c0 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
119d0 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
119e0 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
119f0 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
11a00 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
11a10 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
11a20 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
11a30 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
11a40 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
11a50 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
11a60 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
11a70 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
11a80 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
11a90 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
11aa0 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
11ab0 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
11ac0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
11ad0 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
11ae0 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
11af0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
11b00 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
11b10 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
11b20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
11b30 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
11b40 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
11b50 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
11b60 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
11b70 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
11b80 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
11b90 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
11ba0 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
11bb0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
11bc0 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
11bd0 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ere.  */.    if(
11be0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11bf0 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54  ) memset(pBt->pT
11c00 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a  mpSpace, 0, 4);.
11c10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
11c20 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
11c30 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
11c40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11c50 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
11c60 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
11c70 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
11c80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
11c90 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
11ca0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
11cb0 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
11cc0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
11cd0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
11ce0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11cf0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
11d00 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
11d10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11d20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
11d30 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
11d40 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
11d50 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
11d60 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
11d70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11d80 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11d90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11da0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
11db0 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
11dc0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
11dd0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
11de0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
11df0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
11e00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
11e10 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
11e20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11e30 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
11e40 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
11e50 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
11e60 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
11e70 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
11e80 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
11e90 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
11ea0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
11eb0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
11ec0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
11ed0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
11ee0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
11ef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
11f00 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
11f10 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
11f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11f30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11f40 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
11f50 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
11f60 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
11f70 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
11f80 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
11f90 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
11fa0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
11fb0 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
11fc0 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
11fd0 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
11fe0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
11ff0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
12000 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
12010 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
12020 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
12030 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
12040 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
12050 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
12060 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
12070 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
12080 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
12090 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
120a0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
120b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
120c0 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
120d0 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
120e0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
120f0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
12100 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
12110 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
12120 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12130 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
12140 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
12150 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
12160 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
12170 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
12180 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12190 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
121a0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
121b0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
121c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
121d0 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
121e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
121f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
12200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
12210 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
12220 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
12230 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
12240 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
12250 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
12260 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
12270 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
12280 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
12290 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
122a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
122b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
122c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
122d0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
122e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
122f0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
12300 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
12310 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
12320 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
12330 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
12340 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
12350 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
12360 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
12370 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
12380 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
12390 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
123a0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
123b0 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
123c0 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
123d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
123e0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
123f0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
12400 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
12410 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
12420 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
12430 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
12440 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
12450 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
12460 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
12470 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
12480 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
12490 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
124a0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
124b0 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
124c0 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
124d0 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
124e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
124f0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
12500 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
12510 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
12520 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
12530 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
12540 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
12550 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
12560 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
12570 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
12580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12590 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
125a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
125b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
125c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
125f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12600 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12610 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12620 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
12630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
12640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12670 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12680 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
12690 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
126a0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
126b0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
126c0 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
126d0 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
126e0 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
126f0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
12700 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
12710 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
12720 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
12730 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12750 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12760 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12780 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12790 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
127a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
127b0 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
127c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
127d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
127e0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
127f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
12800 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
12810 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
12820 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
12830 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
12840 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
12850 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
12860 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
12870 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
12880 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
12890 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
128a0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
128b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
128c0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
128d0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
128e0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
128f0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
12900 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
12910 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
12920 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
12930 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
12940 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
12950 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
12960 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
12970 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
12980 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
12990 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
129a0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
129b0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
129c0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
129d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
129e0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
129f0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
12a00 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
12a10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12a20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
12a30 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
12a40 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
12a50 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
12a60 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
12a70 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
12a80 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
12a90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
12aa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12ab0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12ac0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
12ad0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12ae0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
12af0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
12b00 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
12b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12b20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12b40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
12b50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
12b60 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
12b70 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
12b80 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
12b90 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
12ba0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
12bb0 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
12bc0 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
12bd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12be0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
12bf0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
12c00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12c10 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
12c20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12c30 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
12c40 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
12c50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12c60 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
12c70 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
12c80 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
12c90 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
12ca0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
12ce0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
12cf0 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
12d00 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
12d10 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
12d20 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
12d30 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
12d40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
12d50 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
12d60 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
12d70 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
12d80 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
12d90 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
12da0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
12db0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
12dc0 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
12dd0 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
12de0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
12df0 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
12e00 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
12e10 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
12e20 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
12e30 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
12e40 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
12e50 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
12e60 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
12e70 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
12e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
12e90 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
12ea0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
12eb0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
12ec0 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
12ed0 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
12ee0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
12ef0 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
12f00 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
12f10 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
12f20 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
12f30 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
12f40 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
12f50 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
12f60 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
12f70 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
12f80 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
12f90 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
12fa0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
12fb0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
12fc0 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
12fd0 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
12fe0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
12ff0 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
13000 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
13010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13020 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
13030 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
13040 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
13050 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
13060 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13070 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
13080 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13090 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
130a0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
130b0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
130c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
130d0 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
130e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
130f0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
13100 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
13110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
13120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
13130 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
13140 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
13150 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
13160 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
13170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
13180 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
13190 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
131a0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
131b0 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
131c0 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
131d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
131e0 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
131f0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
13200 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
13210 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
13220 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
13230 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13240 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
13250 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
13260 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
13270 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
13280 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
13290 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
132a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
132b0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
132c0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
132d0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
132e0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
132f0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13300 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
13310 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
13320 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13330 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
13340 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
13350 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13360 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13370 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
13380 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
13390 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
133a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
133b0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
133c0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
133d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
133e0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
133f0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
13400 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
13410 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
13420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13430 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
13440 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
13450 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
13460 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
13470 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
13480 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
13490 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
134a0 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
134b0 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
134c0 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
134d0 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
134e0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
134f0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
13500 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
13510 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
13520 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
13530 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
13540 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
13550 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
13560 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
13570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
13580 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13590 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
135a0 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
135b0 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
135c0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
135d0 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
135e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
135f0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
13600 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
13610 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
13620 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13630 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
13640 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
13650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13660 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
13670 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
13680 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
13690 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
136a0 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
136b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f  f /* SQLITE_HAS_
136c0 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f  CODEC || SQLITE_
136d0 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64  DEBUG */..#if !d
136e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
136f0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
13700 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13710 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
13720 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
13730 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
13740 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
13750 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
13760 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
13770 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
13780 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
13790 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
137a0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
137b0 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
137c0 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
137d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
137e0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
137f0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13800 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
13810 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
13820 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
13830 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
13840 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
13850 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13860 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
13870 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
13880 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
13890 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
138a0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
138b0 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
138c0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
138d0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
138e0 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
138f0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
13900 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
13910 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
13920 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
13930 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13940 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
13950 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13960 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
13970 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13980 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
13990 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
139a0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
139b0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
139c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
139d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
139e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
139f0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
13a00 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
13a10 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
13a20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
13a30 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
13a40 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
13a50 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
13a60 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
13a70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
13a80 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
13a90 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
13aa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13ab0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
13ac0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
13ad0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
13ae0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13af0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
13b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13b10 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
13b20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
13b30 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
13b40 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
13b50 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
13b60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13b70 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
13b80 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
13b90 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
13ba0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
13bb0 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
13bc0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13bd0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
13be0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13bf0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
13c00 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
13c10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13c20 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
13c30 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
13c40 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
13c50 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
13c60 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
13c70 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
13c80 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
13c90 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
13ca0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
13cb0 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
13cc0 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
13cd0 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
13ce0 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
13cf0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
13d00 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
13d10 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
13d20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13d30 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
13d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13d50 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
13d60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
13d70 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
13d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13d90 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
13da0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
13db0 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
13dc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13dd0 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
13de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
13df0 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
13e00 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
13e10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
13e20 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
13e30 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
13e40 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
13e50 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
13e60 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
13e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
13e80 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
13e90 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13ea0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
13eb0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13ec0 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
13ed0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13ee0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13ef0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
13f00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13f10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13f20 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
13f30 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
13f40 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
13f50 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
13f60 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
13f70 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
13f80 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
13f90 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
13fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13fb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
13fc0 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
13fd0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
13fe0 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
13ff0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14000 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
14010 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
14020 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
14030 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
14040 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
14050 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
14060 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
14070 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
14080 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
14090 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
140a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
140b0 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
140c0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
140d0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
140e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
140f0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
14100 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
14110 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
14120 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
14130 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14140 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
14150 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
14160 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
14170 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
14180 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
14190 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
141a0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
141b0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
141c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
141d0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
141e0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
141f0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
14200 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
14210 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
14220 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
14230 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
14240 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
14250 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
14260 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
14270 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
14280 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
14290 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
142a0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
142b0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
142c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
142d0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
142e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
142f0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
14300 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14310 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
14320 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
14330 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
14340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14350 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
14360 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
14370 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
14380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14390 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
143a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
143b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
143c0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
143d0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
143e0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
143f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14400 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
14410 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
14420 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
14430 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
14440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14450 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
14460 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
14470 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
14480 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
14490 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
144a0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
144b0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
144c0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
144d0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
144e0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
144f0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
14500 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14510 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
14520 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
14530 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
14540 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
14550 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
14560 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
14570 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
14580 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
14590 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
145a0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
145b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
145c0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
145d0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
145e0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
145f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
14600 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
14610 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
14620 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
14630 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
14640 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14650 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
14660 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
14670 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
14680 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
14690 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
146a0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
146b0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
146c0 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
146d0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
146e0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
146f0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
14700 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
14710 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14720 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
14730 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
14740 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
14750 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14760 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14770 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
14780 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
14790 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
147a0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
147b0 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
147c0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
147d0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
147e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
147f0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
14800 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
14810 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
14820 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
14830 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
14840 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
14850 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
14860 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
14870 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
14880 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
14890 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
148a0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
148b0 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
148c0 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
148d0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
148e0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
148f0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
14900 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
14910 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
14920 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
14930 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
14940 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
14950 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14960 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
14970 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
14980 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
14990 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
149a0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
149b0 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
149c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
149e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
149f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
14a00 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
14a10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
14a20 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
14a30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14a40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14a50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
14a60 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
14a70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
14a80 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
14a90 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
14aa0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
14ab0 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
14ac0 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
14ad0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
14ae0 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
14af0 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
14b00 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
14b10 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
14b20 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
14b30 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
14b40 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
14b50 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
14b60 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
14b70 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
14b80 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
14b90 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
14ba0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
14bb0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
14bc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14bd0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
14bf0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
14c00 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
14c10 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14c20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
14c30 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
14c40 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
14c50 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
14c60 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
14c70 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
14c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14c90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14ca0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14cb0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
14cc0 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
14cd0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
14ce0 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
14cf0 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
14d00 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
14d10 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
14d20 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
14d30 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14d40 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
14d50 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
14d60 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
14d70 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
14d80 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
14d90 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
14da0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
14db0 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
14dc0 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
14dd0 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
14de0 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
14df0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
14e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e10 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
14e20 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
14e30 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
14e40 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
14e50 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
14e60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
14e70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14e80 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
14e90 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
14ea0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
14eb0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
14ec0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
14ed0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
14ee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14ef0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14f00 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14f10 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
14f50 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
14f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14f70 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
14f80 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
14f90 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
14fa0 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
14fb0 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
14fc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14fd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14fe0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14ff0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
15000 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
15010 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
15020 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15030 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
15040 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
15050 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
15060 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
15070 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
15080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15090 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
150a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
150b0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
150c0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
150d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
150e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
150f0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
15100 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
15110 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
15120 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
15130 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
15140 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
15150 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
15160 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
15170 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
15180 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
15190 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
151a0 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
151b0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
151c0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
151d0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
151e0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
151f0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
15200 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
15210 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
15220 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
15230 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
15240 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
15250 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
15260 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
15270 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
15280 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
15290 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
152a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
152b0 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
152c0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
152d0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
152e0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
152f0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
15300 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
15310 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
15320 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
15330 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
15340 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
15350 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
15360 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
15370 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
15380 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
15390 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
153a0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
153b0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
153c0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
153d0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
153e0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
153f0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
15400 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
15410 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
15420 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
15430 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
15440 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
15450 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
15460 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
15470 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
15480 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
15490 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
154a0 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
154b0 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
154c0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
154d0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
154e0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
154f0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
15500 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
15510 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
15520 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
15530 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15540 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
15550 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
15560 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
15570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
15580 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
15590 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
155a0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
155b0 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
155c0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
155d0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
155e0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
155f0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
15600 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
15610 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
15620 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
15630 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
15640 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
15650 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
15660 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
15670 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
15680 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
15690 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
156a0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
156b0 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
156c0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
156d0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
156e0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
156f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15700 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
15710 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
15720 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
15730 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
15740 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
15750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15760 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
15770 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
15780 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
15790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
157a0 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
157b0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
157c0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
157d0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
157e0 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
157f0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
15800 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
15810 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
15820 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
15830 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
15840 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
15850 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
15860 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
15870 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
15880 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
15890 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
158a0 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
158c0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
158d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
158e0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
158f0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
15900 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
15910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15920 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
15930 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
15940 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
15950 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
15960 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
15970 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
15980 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
15990 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
159a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
159b0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
159c0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
159d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
159e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
159f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15a00 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
15a10 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
15a20 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
15a30 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
15a40 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
15a50 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15a60 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
15a70 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
15a80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15a90 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
15aa0 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
15ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
15ac0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
15ad0 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
15ae0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
15af0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
15b00 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
15b10 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
15b20 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
15b30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
15b40 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
15b50 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
15b60 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
15b70 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
15b80 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
15b90 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
15ba0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
15bb0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
15bc0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
15bd0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
15be0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15bf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
15c00 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
15c10 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
15c20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
15c30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15c40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15c50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
15c60 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
15c70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15c80 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
15c90 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
15ca0 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
15cb0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
15cc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15cd0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
15ce0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
15cf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
15d00 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
15d10 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
15d20 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
15d30 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15d40 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
15d50 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
15d60 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
15d70 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
15d80 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
15d90 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
15da0 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
15db0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
15dc0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
15dd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
15de0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
15df0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
15e00 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
15e10 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
15e20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
15e30 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
15e40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15e50 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
15e60 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
15e70 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
15e80 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
15e90 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
15ea0 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
15eb0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
15ec0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
15ed0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
15ee0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15ef0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
15f00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15f10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
15f30 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
15f40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
15f50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15f60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
15f70 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
15f80 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
15f90 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
15fa0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
15fb0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
15fc0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
15fd0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
15fe0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
15ff0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
16000 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
16010 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16020 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
16030 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
16040 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
16050 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
16060 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
16070 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
16080 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
16090 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
160a0 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
160b0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
160c0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
160d0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
160e0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
160f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16100 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
16110 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
16120 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16130 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
16140 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
16150 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
16160 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
16170 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16190 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
161a0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
161b0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
161c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
161d0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
161e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
161f0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
16200 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
16210 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
16220 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
16230 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
16240 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
16250 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
16260 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
16270 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
16280 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
16290 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
162a0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
162b0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
162c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
162d0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
162e0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
162f0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
16300 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
16310 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
16320 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
16330 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
16340 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
16350 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
16360 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
16370 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
16380 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
16390 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
163a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
163b0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
163c0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
163d0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
163e0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
163f0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
16400 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
16410 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
16420 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
16430 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
16440 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
16450 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16460 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
16470 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16480 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
16490 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
164a0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
164b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
164c0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
164d0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
164e0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
164f0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
16500 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
16510 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
16520 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
16530 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
16540 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
16550 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
16560 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
16570 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
16580 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
16590 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
165a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
165b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
165c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
165d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
165e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
165f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
16600 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
16610 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
16620 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
16630 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
16640 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
16650 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
16660 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
16670 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
16680 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
16690 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
166a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
166b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
166c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
166d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
166e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
166f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
16700 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
16710 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
16720 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
16730 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
16740 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
16750 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
16760 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
16770 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
16780 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
16790 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
167a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
167b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
167c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
167d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
167e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
167f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
16800 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
16810 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
16820 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16830 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
16840 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
16850 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
16860 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
16870 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16880 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
16890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
168a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
168b0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
168c0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
168d0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
168e0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
168f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
16900 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
16910 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
16920 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
16930 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
16940 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
16950 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
16960 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
16970 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
16980 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
16990 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
169a0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
169b0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
169c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
169d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
169e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
169f0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
16a00 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
16a10 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
16a20 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
16a30 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
16a40 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
16a50 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
16a60 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
16a70 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
16a80 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
16a90 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
16aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
16ab0 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
16ac0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
16ad0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16ae0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16af0 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
16b00 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
16b10 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
16b20 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
16b30 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16b40 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
16b50 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
16b60 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
16b70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
16b80 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
16b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
16ba0 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
16bb0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
16bc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
16bd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
16be0 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
16bf0 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
16c00 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
16c10 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
16c20 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
16c30 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
16c40 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
16c50 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
16c60 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
16c70 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
16c80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
16c90 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
16ca0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
16cb0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
16cc0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
16cd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16ce0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
16cf0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
16d00 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
16d10 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
16d20 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
16d30 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
16d40 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
16d50 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
16d60 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
16d70 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
16d80 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
16d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
16da0 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
16db0 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
16dc0 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
16dd0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
16de0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
16df0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
16e00 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
16e10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16e20 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
16e30 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
16e40 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
16e50 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
16e60 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
16e70 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
16e80 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
16e90 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
16ea0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
16eb0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
16ec0 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
16ed0 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
16ee0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
16ef0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
16f00 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
16f10 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
16f20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
16f30 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
16f40 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
16f50 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
16f60 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
16f70 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
16f80 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
16f90 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
16fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
16fb0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
16fc0 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
16fd0 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
16fe0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
16ff0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
17000 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
17010 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
17020 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
17030 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
17040 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
17050 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
17060 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
17070 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
17080 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
17090 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
170a0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
170b0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
170c0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
170d0 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
170e0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
170f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
17100 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
17110 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
17120 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
17130 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
17140 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17150 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
17160 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17170 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
17180 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
17190 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
171a0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
171b0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
171c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
171d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
171e0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
171f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
17210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
17230 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
17240 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
17250 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
17260 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
17270 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17280 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
17290 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
172a0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
172b0 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
172c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
172d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
172e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
172f0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
17300 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
17310 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17320 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
17330 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
17340 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
17350 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
17360 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
17370 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
17380 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
17390 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
173a0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
173b0 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
173c0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
173d0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
173e0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
173f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
17400 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
17410 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
17420 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
17430 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
17440 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
17450 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
17460 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17470 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
17480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17490 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
174a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
174b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
174c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
174d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
174e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
174f0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
17500 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
17510 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
17520 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
17530 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
17540 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
17550 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
17560 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
17570 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
17580 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
17590 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
175a0 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
175b0 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
175c0 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
175d0 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
175e0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
175f0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
17600 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
17610 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
17620 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
17630 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
17640 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
17650 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
17660 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
17670 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
17680 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
17690 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
176a0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
176b0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
176c0 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
176d0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
176e0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
176f0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
17700 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
17710 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
17720 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17730 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
17740 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
17750 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17760 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
17770 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
17780 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
17790 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
177a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
177b0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
177c0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
177d0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
177e0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
177f0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
17800 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
17810 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
17820 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
17830 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
17840 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
17850 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
17860 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
17870 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
17880 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
17890 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
178a0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
178b0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
178c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
178d0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
178e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
178f0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
17900 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
17910 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
17920 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17930 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17940 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
17950 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17960 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
17970 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
17980 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
17990 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
179a0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
179b0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
179c0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
179d0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
179e0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
179f0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
17a00 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
17a10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
17a20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
17a30 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
17a40 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
17a50 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
17a80 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
17a90 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17ac0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
17ad0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
17ae0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17b10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17b20 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
17b30 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
17b40 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
17b50 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
17b60 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
17b70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17b80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
17b90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17ba0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
17bb0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
17bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17bd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
17be0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
17bf0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
17c00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
17c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
17c20 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
17c30 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
17c40 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
17c50 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
17c60 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
17c70 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
17c80 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
17c90 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
17ca0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
17cb0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
17cc0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
17cd0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
17ce0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
17cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
17d00 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
17d10 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
17d20 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
17d30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17d40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17d50 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
17d60 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
17d70 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
17d80 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
17d90 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
17da0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
17db0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
17dc0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
17dd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
17de0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
17df0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17e00 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
17e10 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
17e20 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
17e30 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
17e40 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
17e50 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
17e60 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
17e70 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
17e80 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
17e90 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
17ea0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
17eb0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
17ec0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
17ed0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ef0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
17f00 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
17f10 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
17f20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
17f30 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
17f40 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
17f50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17f60 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
17f70 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
17f80 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
17f90 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
17fa0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
17fb0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
17fc0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
17fd0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
17fe0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
17ff0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
18000 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
18010 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
18020 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
18030 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
18040 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
18050 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
18060 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
18070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18080 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
18090 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
180a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
180b0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
180c0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
180d0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
180e0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
180f0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
18100 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
18110 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
18120 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
18130 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
18140 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
18150 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
18160 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
18170 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18180 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
18190 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
181a0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
181b0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
181c0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
181d0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
181e0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
181f0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
18200 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
18210 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
18220 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
18230 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
18240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
18250 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
18260 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
18270 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18280 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
18290 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
182a0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
182b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
182c0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
182d0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
182e0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
182f0 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
18300 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
18310 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
18320 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
18330 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
18340 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
18350 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
18360 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
18370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
18380 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
18390 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
183a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
183b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
183c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
183d0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
183e0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
183f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
18400 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
18410 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
18420 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
18430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
18440 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
18450 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
18460 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
18470 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
18480 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
18490 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
184a0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
184b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
184c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
184d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
184e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
184f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
18500 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
18510 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
18520 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
18530 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
18540 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18550 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18560 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
18570 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
18580 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
18590 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
185a0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
185b0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
185c0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
185d0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
185e0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
185f0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
18600 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
18610 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
18620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
18630 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
18640 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
18650 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
18660 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
18670 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
18680 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
18690 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
186a0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
186b0 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
186c0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
186d0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
186e0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
186f0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
18700 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
18710 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
18720 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
18730 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
18740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18750 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
18760 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
18770 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
18780 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
18790 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
187a0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
187b0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
187c0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
187d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
187e0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
187f0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
18800 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
18810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
18820 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
18830 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
18840 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
18850 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
18860 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
18870 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
18880 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
18890 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
188a0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
188b0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
188c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
188d0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
188e0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
188f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
18900 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
18910 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
18920 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
18930 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
18940 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
18950 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
18960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
18980 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
18990 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
189a0 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
189b0 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
189c0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
189d0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
189e0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
189f0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
18a00 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
18a10 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
18a20 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
18a30 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
18a40 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
18a50 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
18a60 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
18a70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18a80 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
18a90 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
18aa0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
18ab0 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
18ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ad0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18ae0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
18af0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
18b00 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
18b10 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
18b20 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
18b30 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
18b40 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
18b50 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
18b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
18b70 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
18b80 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
18b90 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
18ba0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
18bb0 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
18bc0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
18bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
18be0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
18bf0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
18c00 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
18c10 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
18c20 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
18c30 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
18c40 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
18c50 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
18c60 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
18c70 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
18c80 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
18c90 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
18ca0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
18cb0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
18cc0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
18cd0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
18ce0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
18cf0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18d20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
18d30 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
18d40 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
18d50 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
18d60 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
18d70 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
18d80 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
18d90 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
18da0 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
18db0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18dd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18df0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
18e00 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
18e10 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
18e20 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
18e30 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
18e40 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
18e50 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
18e60 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
18e70 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
18e80 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
18e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
18ea0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
18eb0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
18ec0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18ed0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
18ee0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
18ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18f00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18f10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
18f20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
18f30 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
18f40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
18f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f60 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
18f70 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
18f80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18f90 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
18fa0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
18fb0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
18fc0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
18fd0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
18fe0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
18ff0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19010 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
19020 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
19030 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
19040 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19050 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
19060 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
19070 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
19080 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
19090 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
190a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
190b0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
190c0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
190d0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
190e0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
190f0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
19100 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
19110 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
19120 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
19130 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
19140 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
19150 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
19160 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
19170 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
19180 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
19190 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
191a0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
191b0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
191c0 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
191d0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
191e0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
191f0 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
19200 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
19210 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
19220 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
19230 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
19240 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
19250 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
19260 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
19270 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
19280 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
19290 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
192a0 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
192b0 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
192c0 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
192d0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
192e0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
192f0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
19300 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
19310 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
19320 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
19330 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
19340 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
19350 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
19360 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
19370 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
19380 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
19390 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
193a0 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
193b0 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
193c0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
193d0 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
193e0 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
193f0 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
19400 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
19410 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
19420 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
19430 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
19440 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
19450 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
19460 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
19470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19480 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
19490 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
194a0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
194b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
194c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
194d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
194e0 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
194f0 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
19500 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
19510 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
19520 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
19530 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
19540 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
19550 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
19560 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
19570 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
19580 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
19590 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
195a0 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
195b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
195c0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
195d0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
195e0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
195f0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
19600 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
19610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19630 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
19640 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
19650 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
19660 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19670 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
19680 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
19690 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
196a0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
196b0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
196c0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
196d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
196e0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
196f0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
19700 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
19710 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
19720 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
19730 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
19740 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
19750 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
19760 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
19770 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19780 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
19790 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
197a0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
197b0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
197c0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
197d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
197e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
197f0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
19800 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
19810 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
19820 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
19830 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
19840 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
19850 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
19860 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
198a0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
198b0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
198c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
198d0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
198e0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
198f0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
19900 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
19910 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
19920 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
19930 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
19940 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
19950 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
19960 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
19970 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
19980 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
19990 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
199a0 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
199b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
199c0 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
199d0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
199e0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
199f0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
19a00 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
19a10 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
19a20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
19a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19a40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19a50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19a60 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
19a70 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
19a80 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
19a90 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
19aa0 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
19ab0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
19ac0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
19ad0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
19ae0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
19af0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
19b00 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
19b10 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
19b20 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
19b30 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
19b40 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
19b50 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
19b60 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
19b70 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
19b80 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
19b90 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
19ba0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
19bb0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
19bc0 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
19bd0 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
19be0 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
19bf0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
19c00 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
19c10 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
19c20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
19c30 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
19c40 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
19c50 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
19c60 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
19c70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19c80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
19c90 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
19ca0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
19cb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
19cd0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
19ce0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
19cf0 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
19d00 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
19d10 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
19d20 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
19d30 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
19d40 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
19d50 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
19d60 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
19d70 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
19d80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
19d90 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
19da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19db0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
19dc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19dd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
19de0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
19df0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
19e00 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
19e10 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
19e20 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19e30 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
19e40 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
19e50 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
19e60 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
19e70 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
19e80 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
19e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19ea0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
19eb0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
19ec0 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
19ed0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
19ee0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
19ef0 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
19f00 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
19f10 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
19f20 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
19f30 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
19f40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19f50 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
19f60 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
19f70 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
19f80 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
19f90 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
19fa0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
19fb0 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
19fc0 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19ff0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1a000 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1a010 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1a040 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1a050 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1a060 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1a070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a080 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1a090 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1a0a0 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1a0b0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1a0c0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1a0d0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1a0e0 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1a0f0 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1a100 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1a110 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1a120 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1a130 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1a140 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1a150 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1a160 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1a170 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1a180 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1a190 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1a1a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1a1b0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1a1c0 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1a1d0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1a1e0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1a1f0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1a200 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1a210 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1a220 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1a230 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1a240 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1a250 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1a260 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1a270 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1a280 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1a290 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1a2a0 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1a2b0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1a2c0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1a2d0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1a2e0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1a2f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1a300 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1a310 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1a320 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1a330 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1a340 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1a350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1a360 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a370 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1a380 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1a390 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a3a0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a3b0 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1a3c0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a3d0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1a3e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1a3f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a400 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1a410 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1a420 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1a430 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1a440 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1a450 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1a460 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1a470 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1a480 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1a490 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1a4a0 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1a4b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a4c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1a4d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1a4e0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1a4f0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1a500 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1a510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a530 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1a540 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1a550 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1a560 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1a570 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1a580 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1a590 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a5a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a5b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a5c0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1a5d0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1a5e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1a5f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1a600 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1a610 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1a620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a630 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1a640 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1a650 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a660 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a670 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1a680 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1a690 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1a6a0 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1a6b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1a6c0 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1a6d0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1a6e0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1a6f0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1a700 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1a710 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1a720 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1a730 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1a740 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1a750 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1a760 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1a770 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1a780 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1a790 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1a7a0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1a7b0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1a7c0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1a7d0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1a7e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
1a7f0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
1a800 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a810 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a820 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1a830 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1a840 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
1a850 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
1a860 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a870 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
1a880 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a890 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1a8a0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
1a8b0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1a8c0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
1a8d0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
1a8e0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
1a8f0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
1a900 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
1a910 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a920 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1a930 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
1a940 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
1a950 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
1a960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a970 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1a980 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
1a990 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
1a9a0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
1a9b0 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
1a9c0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
1a9d0 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1a9e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1a9f0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
1aa00 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
1aa10 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1aa20 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
1aa30 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1aa40 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
1aa50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1aa60 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1aa70 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
1aa80 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
1aa90 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
1aaa0 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
1aab0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
1aac0 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
1aad0 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
1aae0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
1aaf0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
1ab00 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
1ab10 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
1ab20 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
1ab30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ab40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ab50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ab60 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
1ab70 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1ab80 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1ab90 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
1aba0 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1abb0 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
1abc0 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
1abd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1abe0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1abf0 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
1ac00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ac10 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1ac20 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
1ac30 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
1ac40 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
1ac50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1ac60 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1ac70 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1ac80 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1ac90 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1aca0 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1acb0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1acc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1acd0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1ace0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1acf0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1ad00 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1ad10 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ad20 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ad30 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1ad40 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1ad50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ad60 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1ad70 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1ad80 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1ad90 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1ada0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1adb0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1adc0 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1add0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ade0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1adf0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ae00 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1ae10 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1ae20 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1ae30 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1ae40 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1ae50 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1ae60 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1ae70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1ae80 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1ae90 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1aea0 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1aeb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1aec0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1aed0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1aee0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1aef0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1af00 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1af10 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1af20 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1af30 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1af40 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1af50 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1af60 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1af70 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1af80 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1af90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1afa0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1afb0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1afc0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1afd0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1afe0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1aff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b000 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1b010 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1b020 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1b030 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1b040 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1b050 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1b060 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1b070 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1b080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b090 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1b0a0 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1b0b0 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1b0c0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1b0d0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1b0e0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1b0f0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1b100 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1b110 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1b120 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1b130 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1b140 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1b150 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1b160 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1b170 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1b180 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1b190 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1b1a0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1b1b0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1b1c0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1b1d0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1b1e0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b1f0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1b200 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1b210 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1b220 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1b230 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1b240 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1b250 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1b260 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1b270 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1b280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1b290 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1b2a0 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1b2b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1b2c0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1b2d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1b2e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1b2f0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1b300 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1b310 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1b320 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1b330 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1b340 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1b350 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1b360 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1b370 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1b380 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1b390 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1b3a0 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1b3b0 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1b3c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1b3d0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1b3e0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1b3f0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1b400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b410 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1b420 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1b430 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1b440 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b450 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1b460 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b470 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1b480 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b490 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1b4a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1b4b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b4c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1b4d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1b4e0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1b4f0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1b500 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1b510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1b530 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b540 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1b550 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1b570 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1b580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1b590 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1b5a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1b5b0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1b5c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1b5d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1b5e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1b5f0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1b600 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1b610 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1b640 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b650 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1b660 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1b670 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1b680 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1b690 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1b6a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1b6b0 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1b6c0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1b6d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1b6e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b6f0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1b700 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1b710 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1b720 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1b730 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1b740 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b750 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1b760 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1b770 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1b780 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1b790 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1b7a0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1b7b0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1b7c0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1b7d0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1b7e0 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1b7f0 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1b800 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1b810 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1b820 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1b830 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
1b840 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
1b850 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1b860 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
1b870 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
1b880 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1b890 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
1b8a0 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
1b8b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1b8c0 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1b8d0 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
1b8e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1b8f0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
1b900 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1b910 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
1b920 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
1b930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b940 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
1b950 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
1b960 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1b970 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
1b980 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
1b990 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
1b9a0 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
1b9b0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
1b9c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1b9d0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
1b9e0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
1b9f0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
1ba00 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1ba10 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1ba20 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
1ba30 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
1ba40 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1ba50 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ba60 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
1ba70 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1ba80 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1ba90 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1baa0 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
1bab0 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
1bac0 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
1bad0 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
1bae0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
1baf0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
1bb00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
1bb10 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
1bb20 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
1bb30 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1bb40 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1bb50 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1bb60 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1bb70 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1bb80 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1bb90 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1bba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1bbb0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1bbc0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1bbd0 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1bbe0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1bbf0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1bc00 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1bc10 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1bc20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1bc30 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1bc40 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1bc50 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1bc60 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1bc70 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1bc80 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1bc90 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1bca0 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1bcb0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1bcc0 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1bcd0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1bce0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1bcf0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1bd00 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1bd10 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1bd20 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1bd30 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1bd40 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1bd50 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1bd60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1bd70 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1bd80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1bd90 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1bda0 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1bdb0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1bdc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1bdd0 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1bde0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1bdf0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1be00 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1be10 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1be20 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1be30 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1be40 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1be50 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1be60 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1be70 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1be80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1be90 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1bea0 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1beb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1bec0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1bed0 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1bee0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1bef0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1bf00 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1bf10 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1bf20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1bf30 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1bf40 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1bf50 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1bf60 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1bf70 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1bf80 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1bf90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1bfa0 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1bfb0 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1bfc0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1bfd0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1bfe0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1bff0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1c000 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1c010 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1c020 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1c030 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1c040 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1c050 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1c060 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1c070 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1c080 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1c090 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1c0a0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1c0b0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1c0c0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1c0d0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1c0e0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1c0f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1c100 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1c110 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1c120 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1c130 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1c140 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1c150 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1c160 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1c170 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1c180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1c190 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1c1a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1c1b0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1c1c0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1c1d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1c1e0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1c1f0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1c200 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1c210 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1c220 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1c230 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1c240 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1c250 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1c260 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1c270 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1c280 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1c290 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1c2a0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1c2b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1c2c0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1c2d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1c2e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c2f0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1c300 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1c310 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c330 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1c340 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1c350 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1c360 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1c370 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1c380 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1c390 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1c3a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c3b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c3c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1c3d0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1c3e0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1c3f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1c400 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1c410 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1c420 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1c440 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1c450 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1c460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c480 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1c490 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1c4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c4b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c4c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1c4d0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1c4e0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1c4f0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1c500 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1c510 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1c520 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1c530 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1c540 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1c550 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1c560 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1c570 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1c580 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1c590 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1c5a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1c5b0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1c5c0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1c5d0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1c5e0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1c5f0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1c600 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1c610 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1c620 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1c630 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1c640 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1c650 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1c660 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1c670 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1c680 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1c690 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1c6a0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1c6b0 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1c6c0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1c6d0 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1c6e0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1c6f0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1c700 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1c710 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1c720 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1c730 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1c740 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1c750 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1c760 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1c770 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1c780 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1c790 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1c7a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c7b0 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1c7c0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1c7d0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1c7e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1c7f0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1c800 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1c810 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1c820 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1c830 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1c840 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1c850 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1c860 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1c870 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1c880 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1c890 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1c8a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1c8b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c8c0 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1c8d0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1c8e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1c8f0 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1c900 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1c910 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1c920 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1c930 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1c940 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1c950 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1c960 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1c970 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1c980 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1c990 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1c9a0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1c9b0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1c9c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1c9d0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1c9e0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1c9f0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1ca00 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1ca10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1ca20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ca30 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1ca40 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1ca50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1ca60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ca70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1ca80 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1ca90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1caa0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1cab0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1cac0 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1cad0 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1cae0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1caf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1cb00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1cb10 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1cb20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1cb30 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1cb40 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1cb50 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1cb60 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1cb70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1cb80 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1cb90 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1cba0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1cbb0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1cbc0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1cbd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1cbe0 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1cbf0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1cc00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cc10 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1cc20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1cc30 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1cc40 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1cc50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1cc60 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1cc70 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1cc80 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1cc90 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1cca0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1ccb0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1ccc0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1ccd0 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1cce0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1ccf0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
1cd00 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
1cd10 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
1cd20 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1cd30 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
1cd40 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
1cd50 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
1cd60 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
1cd70 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1cd80 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
1cd90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cda0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
1cdb0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
1cdc0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1cdd0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1cde0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
1cdf0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
1ce00 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
1ce10 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
1ce20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1ce30 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1ce40 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1ce50 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1ce60 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1ce70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1ce80 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1ce90 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1cea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1ceb0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
1cec0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1ced0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1cee0 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
1cef0 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
1cf00 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
1cf10 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
1cf20 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
1cf30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1cf40 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
1cf50 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
1cf60 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1cf70 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
1cf80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
1cf90 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
1cfa0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
1cfb0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
1cfc0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
1cfd0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
1cfe0 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
1cff0 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
1d000 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
1d010 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
1d020 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
1d030 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
1d040 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
1d050 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1d060 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
1d070 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
1d080 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
1d090 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
1d0a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
1d0b0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1d0c0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
1d0d0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
1d0e0 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
1d0f0 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
1d100 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1d110 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
1d120 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
1d130 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
1d140 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1d150 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1d160 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1d170 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
1d180 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
1d190 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1d1a0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
1d1b0 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
1d1c0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1d1d0 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
1d1e0 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
1d1f0 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
1d200 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
1d210 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
1d220 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
1d230 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
1d240 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
1d250 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
1d260 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
1d270 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
1d280 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1d290 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1d2a0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
1d2b0 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
1d2c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1d2d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1d2e0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
1d2f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1d300 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1d310 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1d320 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
1d330 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1d340 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
1d350 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1d360 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
1d370 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1d380 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
1d390 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
1d3a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d3b0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1d3c0 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
1d3d0 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
1d3e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1d3f0 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
1d400 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
1d410 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
1d420 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
1d430 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
1d440 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
1d450 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
1d460 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
1d470 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
1d480 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
1d490 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
1d4a0 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
1d4b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
1d4c0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
1d4d0 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
1d4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d4f0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
1d500 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
1d510 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
1d520 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1d530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d540 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
1d550 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
1d560 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
1d570 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
1d580 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
1d590 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
1d5a0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
1d5b0 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
1d5c0 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
1d5d0 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
1d5e0 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
1d5f0 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
1d600 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
1d610 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
1d620 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
1d630 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
1d640 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
1d650 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1d660 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
1d670 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
1d680 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
1d690 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
1d6a0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
1d6b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1d6c0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
1d6d0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1d6e0 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
1d6f0 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
1d700 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
1d710 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
1d720 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
1d730 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
1d740 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
1d750 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
1d760 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
1d770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d780 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
1d790 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
1d7a0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
1d7b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d7c0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
1d7d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1d7e0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1d7f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d800 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1d810 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
1d820 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
1d830 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1d840 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
1d850 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
1d860 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
1d870 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
1d880 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
1d890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1d8a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
1d8b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d8c0 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
1d8d0 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
1d8e0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
1d8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d900 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
1d910 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
1d920 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1d930 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1d940 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d950 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
1d960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d970 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1d980 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
1d990 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1d9a0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
1d9b0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
1d9c0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1d9d0 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
1d9e0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
1d9f0 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
1da00 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
1da10 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1da20 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
1da30 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
1da40 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
1da50 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
1da60 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
1da70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
1da80 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
1da90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1daa0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1dab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dac0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
1dad0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
1dae0 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
1daf0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
1db00 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
1db10 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
1db20 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
1db30 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
1db40 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
1db50 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
1db60 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
1db70 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
1db80 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
1db90 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
1dba0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
1dbb0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
1dbc0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1dbd0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
1dbe0 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
1dbf0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1dc00 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
1dc10 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1dc20 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
1dc30 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
1dc40 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
1dc50 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1dc60 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
1dc70 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
1dc80 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
1dc90 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
1dca0 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
1dcb0 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
1dcc0 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
1dcd0 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
1dce0 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
1dcf0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
1dd00 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
1dd10 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
1dd20 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
1dd30 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
1dd40 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
1dd50 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
1dd60 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1dd70 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
1dd80 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
1dd90 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
1dda0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
1ddb0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
1ddc0 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
1ddd0 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
1dde0 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
1ddf0 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
1de00 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
1de10 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
1de20 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
1de30 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
1de40 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
1de50 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
1de60 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
1de70 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1de80 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
1de90 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
1dea0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
1deb0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
1dec0 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
1ded0 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
1dee0 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
1def0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1df00 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
1df10 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
1df20 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
1df30 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
1df40 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
1df50 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
1df60 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
1df70 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
1df80 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
1df90 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
1dfa0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
1dfb0 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
1dfc0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1dfd0 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
1dfe0 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
1dff0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
1e000 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
1e010 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1e020 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1e030 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
1e040 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
1e050 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1e080 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1e090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e0b0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1e0c0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1e0d0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
1e100 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
1e110 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
1e120 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e140 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
1e150 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1e160 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
1e170 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e190 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
1e1a0 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
1e1b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e1c0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1e1d0 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
1e1e0 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
1e1f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e200 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1e210 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
1e220 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
1e230 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rFlag==1 );..  /
1e240 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1e250 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
1e260 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
1e270 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
1e280 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
1e290 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
1e2a0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1e2b0 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
1e2c0 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
1e2d0 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
1e2e0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1e2f0 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
1e300 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
1e310 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
1e320 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
1e330 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1e340 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1e350 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
1e360 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b  Info!=0, wrFlag+
1e370 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1) );.  assert( 
1e380 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
1e390 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1e3a0 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
1e3b0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1e3c0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
1e3d0 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
1e3e0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
1e3f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
1e400 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1e410 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
1e420 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
1e430 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1e440 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
1e450 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
1e460 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e470 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  ta );..  if( NEV
1e480 45 52 28 77 72 46 6c 61 67 20 26 26 20 28 70 42  ER(wrFlag && (pB
1e490 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1e4a0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29  S_READ_ONLY)!=0)
1e4b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1e4c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1e4d0 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
1e4e0 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
1e4f0 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
1e500 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46  .    assert( wrF
1e510 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54  lag==0 );.    iT
1e520 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
1e530 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
1e540 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
1e550 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
1e560 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
1e570 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
1e580 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
1e590 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
1e5a0 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
1e5b0 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
1e5c0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
1e5d0 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
1e5e0 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
1e5f0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
1e600 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
1e610 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
1e620 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
1e630 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1e640 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54  =0 || wrFlag==BT
1e650 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a  CF_WriteFlag );.
1e660 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
1e670 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
1e680 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1e690 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1e6a0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1e6b0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1e6c0 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1e6d0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1e6e0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1e6f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e700 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
1e710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1e720 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1e730 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1e740 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1e770 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1e780 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1e7b0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1e7c0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1e7d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1e800 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1e810 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1e820 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e840 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
1e850 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
1e860 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1e890 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
1e8a0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1e8b0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1e8c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1e8d0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
1e8e0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
1e8f0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
1e900 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e910 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e930 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1e940 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
1e950 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
1e960 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
1e970 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
1e980 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
1e990 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
1e9a0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
1e9b0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
1e9c0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
1e9d0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
1e9e0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
1e9f0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
1ea00 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
1ea10 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
1ea20 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
1ea30 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
1ea40 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
1ea50 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ea60 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
1ea70 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
1ea80 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
1ea90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1eaa0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
1eab0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
1eac0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
1ead0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
1eae0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
1eaf0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
1eb00 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
1eb10 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
1eb20 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
1eb30 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
1eb40 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
1eb50 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
1eb60 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
1eb70 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
1eb80 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
1eb90 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
1eba0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
1ebb0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
1ebc0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
1ebd0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
1ebe0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
1ebf0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1ec00 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
1ec10 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1ec20 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
1ec30 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
1ec40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1ec50 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
1ec60 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1ec70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ec80 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
1ec90 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
1eca0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
1ecb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1ecc0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
1ecd0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
1ece0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
1ecf0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
1ed00 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1ed10 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
1ed20 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1ed30 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1ed40 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1ed50 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
1ed60 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1ed70 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
1ed80 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
1ed90 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
1eda0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
1edb0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
1edc0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
1edd0 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
1ede0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
1edf0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1ee00 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
1ee10 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1ee20 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
1ee30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1ee40 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1ee50 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1ee60 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1ee70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
1ee80 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1ee90 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
1eea0 6c 69 74 65 33 44 62 46 72 65 65 28 70 42 74 72  lite3DbFree(pBtr
1eeb0 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f  ee->db, pCur->aO
1eec0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
1eed0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1eee0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1eef0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1ef00 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1ef10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ef20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1ef30 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1ef40 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1ef50 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1ef60 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1ef70 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1ef80 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1ef90 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1efa0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1efb0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1efc0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1efd0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1efe0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1eff0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1f000 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1f010 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1f020 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1f030 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1f040 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1f050 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1f060 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1f070 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1f080 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1f090 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1f0a0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1f0b0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1f0c0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1f0d0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1f0e0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1f0f0 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1f100 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1f110 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1f120 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1f130 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1f140 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1f150 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1f160 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1f170 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1f180 6e 67 20 61 67 67 72 65 73 73 69 76 65 20 69 6e  ng aggressive in
1f190 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1f1a0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1f1b0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1f1c0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1f1d0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1f1e0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1f1f0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1f200 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1f210 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1f220 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1f230 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1f240 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1f250 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1f260 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1f270 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1f280 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1f290 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1f2a0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1f2b0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1f2c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1f2d0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1f2e0 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
1f2f0 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
1f300 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
1f310 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
1f320 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
1f330 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
1f340 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
1f350 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
1f360 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
1f370 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
1f380 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
1f390 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
1f3a0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
1f3b0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1f3c0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1f3d0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1f3e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67  {.      int iPag
1f3f0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1f400 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
1f410 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1f420 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1f430 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1f440 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1f450 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
1f460 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
1f470 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1f480 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1f490 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1f4a0 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1f4b0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1f4c0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1f4d0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1f4e0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1f4f0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1f500 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1f510 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1f520 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1f560 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1f570 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f5b0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1f5c0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f600 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1f610 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1f620 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1f630 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1f640 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20  nfo);        \. 
1f650 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
1f660 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
1f670 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f6a0 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f6f0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1f700 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1f750 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
1f760 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
1f770 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
1f780 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1f790 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1f7a0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
1f7b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1f7c0 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
1f7d0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
1f7e0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
1f7f0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
1f800 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
1f810 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
1f820 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
1f830 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
1f840 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
1f850 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
1f860 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1f870 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
1f880 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f890 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
1f8a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1f8b0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
1f8c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f8d0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
1f8e0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
1f8f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1f900 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
1f910 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
1f920 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
1f930 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
1f940 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
1f950 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
1f960 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1f970 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
1f980 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
1f990 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1f9a0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
1f9b0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
1f9c0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
1f9d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1f9e0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
1f9f0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
1fa00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1fa10 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
1fa20 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1fa30 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
1fa40 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
1fa50 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1fa60 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
1fa70 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1fa80 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
1fa90 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1faa0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
1fab0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1fac0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1fad0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1fae0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1faf0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fb00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1fb10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fb20 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1fb30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1fb40 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
1fb50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1fb60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1fb70 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1fb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
1fb90 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1fba0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1fbb0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1fbc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fbd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
1fbe0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1fbf0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1fc00 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
1fc10 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
1fc20 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1fc30 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
1fc40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
1fc50 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
1fc60 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1fc70 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
1fc80 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
1fc90 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1fca0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
1fcb0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
1fcc0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
1fcd0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
1fce0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
1fcf0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
1fd00 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1fd10 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
1fd20 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1fd30 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1fd40 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
1fd50 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
1fd60 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
1fd70 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
1fd80 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
1fd90 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
1fda0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
1fdb0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1fdc0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
1fdd0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1fde0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1fdf0 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1fe00 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1fe10 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1fe20 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fe30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fe40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1fe50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1fe60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1fe70 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31  ]->intKeyLeaf==1
1fe80 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1fe90 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1fea0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1feb0 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
1fec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1fed0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1fee0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1fef0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1ff00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ff10 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1ff20 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1ff30 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1ff40 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1ff50 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1ff60 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1ff70 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1ff80 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1ff90 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1ffa0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1ffb0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1ffc0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1ffd0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1ffe0 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1fff0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
20000 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
20010 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20020 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
20030 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
20040 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
20050 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
20060 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
20070 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
20080 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
20090 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
200a0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
200b0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
200c0 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
200d0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
200e0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
200f0 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
20100 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
20110 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
20120 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
20130 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
20140 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
20150 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
20160 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
20170 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
20180 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
20190 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
201a0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
201b0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
201c0 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
201d0 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
201e0 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
201f0 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
20200 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
20210 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
20220 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
20230 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
20240 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
20250 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
20260 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
20270 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
20280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
20290 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
202a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
202c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
202d0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
202e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
202f0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
20300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
20310 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
20320 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
20330 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
20340 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
20350 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
20360 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20380 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
20390 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
203a0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
203b0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
203c0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
203d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
203e0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
203f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20400 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
20410 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
20420 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
20430 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20440 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
20450 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
20460 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
20470 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
20480 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
20490 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
204a0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
204b0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
204c0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
204d0 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
204e0 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
204f0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
20500 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
20510 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
20520 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
20530 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
20540 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
20550 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
20560 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
20570 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
20580 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20590 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
205a0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
205b0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
205c0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
205d0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
205e0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
205f0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
20600 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20610 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
20620 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
20630 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
20640 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
20650 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
20660 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
20670 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
20680 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
20690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
206a0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
206b0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
206c0 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
206d0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
206e0 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
206f0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
20700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20710 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
20720 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
20730 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
20740 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
20760 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
20770 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
20780 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50   (ppPage==0) ? P
20790 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
207a0 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  Y : 0);.    asse
207b0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
207c0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b  K || pPage==0 );
207d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
207e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
207f0 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28  next = get4byte(
20800 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  pPage->aData);. 
20810 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67     }.  }..  *pPg
20820 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20  noNext = next;. 
20830 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
20840 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61     *ppPage = pPa
20850 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
20860 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
20870 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
20880 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  n (rc==SQLITE_DO
20890 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  NE ? SQLITE_OK :
208a0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
208b0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20  opy data from a 
208c0 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65  buffer to a page
208d0 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65  , or from a page
208e0 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a   to a buffer..**
208f0 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20  .** pPayload is 
20900 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
20910 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61  a stored on data
20920 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
20930 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  e..** If argumen
20940 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20  t eOp is false, 
20950 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73  then nByte bytes
20960 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
20970 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79  ied.** from pPay
20980 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66  load to the buff
20990 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79  er pointed at by
209a0 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73   pBuf. If eOp is
209b0 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73   true,.** then s
209c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
209d0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
209e0 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74  pDbPage and nByt
209f0 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
20a00 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  ta are copied fr
20a10 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
20a20 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a  uf to pPayload..
20a30 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
20a40 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
20a50 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73  uccess, otherwis
20a60 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  e an error code.
20a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
20a80 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f  opyPayload(.  vo
20a90 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20  id *pPayload,   
20aa0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
20ab0 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
20ac0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ae0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
20af0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  fer */.  int nBy
20b00 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20b10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20b20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f  bytes to copy */
20b30 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20  .  int eOp,     
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b50 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70  0 -> copy from p
20b60 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74  age, 1 -> copy t
20b70 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61  o page */.  DbPa
20b80 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20  ge *pDbPage     
20b90 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
20ba0 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61  ntaining pPayloa
20bb0 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f  d */.){.  if( eO
20bc0 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  p ){.    /* Copy
20bd0 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65   data from buffe
20be0 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69  r to page (a wri
20bf0 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  te operation) */
20c00 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
20c10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20c20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
20c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20c50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rc;.    }.    me
20c60 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
20c70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  Buf, nByte);.  }
20c80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  else{.    /* Cop
20c90 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65  y data from page
20ca0 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65   to buffer (a re
20cb0 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f  ad operation) */
20cc0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66  .    memcpy(pBuf
20cd0 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74  , pPayload, nByt
20ce0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
20cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20d00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20d10 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
20d20 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20  ad or overwrite 
20d30 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
20d40 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65  ion.** for the e
20d50 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43  ntry that the pC
20d60 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
20d70 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f  nting to. The eO
20d80 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  p.** argument is
20d90 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
20da0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
20db0 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   0: The operatio
20dc0 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70  n is a read. Pop
20dd0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
20de0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31  ow cache..**   1
20df0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
20e00 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75  is a write. Popu
20e10 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
20e20 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a  w cache..**   2:
20e30 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
20e40 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74  s a read. Do not
20e50 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
20e60 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
20e70 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
20e80 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
20e90 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
20ea0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
20eb0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
20ec0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
20ed0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
20ee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
20ef0 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
20f00 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
20f10 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
20f20 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
20f30 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
20f40 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
20f50 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
20f60 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
20f70 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
20f80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
20f90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64  erflow pages and
20fa0 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75   the.** eOp argu
20fb0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74  ment is not 2, t
20fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
20fd0 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
20fe0 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a  for and lazily .
20ff0 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65  ** populates the
21000 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21010 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
21020 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
21030 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
21040 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
21050 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
21060 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
21070 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
21080 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
21090 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
210a0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
210b0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
210c0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
210d0 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76  it may be.** inv
210e0 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65  alidated if some
210f0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72   other cursor wr
21100 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ites to the same
21110 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a   table, or if.**
21120 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
21130 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  oved to a differ
21140 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f  ent row. Additio
21150 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76  nally, in auto-v
21160 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74  acuum.** mode, t
21170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65  he following eve
21180 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  nts may invalida
21190 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  te an overflow p
211a0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a  age-list cache..
211b0 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63  **.**   * An inc
211c0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c  remental vacuum,
211d0 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74  .**   * A commit
211e0 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d   in auto_vacuum=
211f0 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20  "full" mode,.** 
21200 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74    * Creating a t
21210 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72  able (may requir
21220 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72  e moving an over
21230 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73  flow page)..*/.s
21240 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73  tatic int access
21250 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
21260 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
21270 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
21280 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
21290 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
212a0 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20  2 offset,       
212b0 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
212c0 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74  ing this far int
212d0 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  o payload */.  u
212e0 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  32 amt,         
212f0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73      /* Read this
21300 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20   many bytes */. 
21310 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21320 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74  pBuf, /* Write t
21330 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68  he bytes into th
21340 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20  is buffer */ .  
21350 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20  int eOp         
21360 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20       /* zero to 
21370 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74  read. non-zero t
21380 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20  o write. */.){. 
21390 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
213a0 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20  aPayload;.  int 
213b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
213c0 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
213d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
213e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
213f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
21400 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
21410 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
21420 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21430 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21450 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
21460 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
21470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21480 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21490 45 41 44 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20  EAD.  int bEnd; 
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
214d0 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74  ng to end of dat
214e0 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  a */.#endif..  a
214f0 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
21500 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21510 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21520 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
21530 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21540 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
21550 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
21560 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21570 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21580 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
21590 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20  || offset==0 ); 
215a0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61     /* Always sta
215b0 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  rt from beginnin
215c0 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a  g for eOp==2 */.
215d0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
215e0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
215f0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
21600 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53  ayload;.#ifdef S
21610 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
21620 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
21630 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d  d = offset+amt==
21640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
21650 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  oad;.#endif.  as
21660 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
21670 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
21680 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66  Payload );..  if
21690 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  ( &aPayload[pCur
216a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
216b0 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
216c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
216d0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
216e0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
216f0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
21700 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
21710 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
21720 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21730 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
21740 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
21750 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
21760 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
21770 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
21780 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
21790 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
217a0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
217b0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
217c0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
217d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
217e0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
217f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
21800 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
21810 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
21820 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
21830 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  set], pBuf, a, (
21840 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61  eOp & 0x01), pPa
21850 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
21860 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
21870 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
21880 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
21890 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
218a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
218b0 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  cal;.  }..  if( 
218c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
218d0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
218e0 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
218f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
21900 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
21910 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
21920 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
21930 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
21940 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
21950 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
21960 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
21970 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
21980 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
21990 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
219a0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
219b0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
219c0 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
219d0 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
219e0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
219f0 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
21a00 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
21a10 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
21a20 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
21a30 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
21a40 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
21a50 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
21a60 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
21a70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
21a80 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
21a90 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
21aa0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
21ab0 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
21ac0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
21ad0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21ae0 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
21af0 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
21b00 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
21b10 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
21b20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
21b30 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
21b40 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
21b50 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
21b60 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
21b70 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
21b80 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
21b90 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
21ba0 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
21bb0 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
21bc0 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
21bd0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
21be0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
21bf0 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
21c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
21c10 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c 20 70  r->pBtree->db, p
21c20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
21c30 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
21c40 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
21c50 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
21c60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
21c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
21c80 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EM;.        }els
21c90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
21ca0 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20  r->nOvflAlloc = 
21cb0 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20  nOvfl*2;.       
21cc0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
21cd0 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
21ce0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21cf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21d10 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
21d20 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
21d30 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
21d40 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
21d50 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
21d60 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
21d70 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21d80 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
21d90 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
21da0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
21db0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
21dc0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
21dd0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
21de0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
21df0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
21e00 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
21e10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
21e20 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
21e30 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
21e40 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  fl)!=0.     && p
21e50 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
21e60 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a  ffset/ovflSize].
21e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64      ){.      iId
21e80 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
21e90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
21ea0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
21eb0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
21ec0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
21ed0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
21ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
21ef0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
21f00 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
21f10 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
21f20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
21f30 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
21f40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
21f50 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
21f60 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
21f70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
21f80 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20  F_ValidOvfl)!=0 
21f90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
21fa0 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t(!pCur->aOverfl
21fb0 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72  ow[iIdx] || pCur
21fc0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21fd0 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  ]==nextPage);.  
21fe0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
21ff0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
22000 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
22010 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
22020 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
22030 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
22040 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
22050 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
22060 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
22070 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
22080 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
22090 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
220a0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
220b0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
220c0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
220d0 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
220e0 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
220f0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
22100 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
22110 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
22120 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
22130 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
22140 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
22150 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
22160 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
22170 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
22180 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
22190 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  y must be alloca
221a0 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21  ted because eOp!
221b0 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65  =2.        ** he
221c0 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20  re.  If eOp==2, 
221d0 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61  then offset==0 a
221e0 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  nd this branch i
221f0 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20  s never taken.. 
22200 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22210 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
22220 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
22230 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
22240 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
22250 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  vfl );.        i
22260 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
22270 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
22280 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
22290 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
222a0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
222b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
222c0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
222d0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
222e0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
222f0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
22300 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
22310 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
22320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22330 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
22340 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
22350 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
22360 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
22370 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
22380 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
22390 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
223a0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
223b0 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
223c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
223d0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
223e0 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
223f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
22400 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
22410 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
22420 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
22430 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
22440 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
22450 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
22460 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
22470 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
22480 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
22490 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
224a0 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
224b0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
224c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
224d0 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
224e0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
224f0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
22500 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
22510 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
22520 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
22530 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
22540 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
22550 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
22560 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
22570 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
22580 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
22590 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
225a0 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
225b0 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74   **   5) the dat
225c0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57  abase is not a W
225d0 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20  AL database,.   
225e0 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c       **   6) all
225f0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70   data from the p
22600 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61  age is being rea
22610 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
22620 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
22630 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
22640 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
22650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22660 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
22670 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
22680 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
22690 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
226a0 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
226b0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
226c0 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
226d0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
226e0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
226f0 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
22700 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f  .        if( (eO
22710 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20  p&0x01)==0      
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
22750 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
22790 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
227a0 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53  bEnd || a==ovflS
227b0 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ize)            
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20    /* (6) */.    
227e0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
227f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
22800 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
22810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
22820 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
22830 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
22840 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
22850 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
22860 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
22870 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
22880 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
22890 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228b0 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (5) */.        )
228c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
228d0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
228e0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
228f0 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
22900 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
22910 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
22920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22930 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
22940 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
22950 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
22960 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
22970 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
22980 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
22990 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
229a0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
229b0 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
229c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
229d0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
229e0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
229f0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
22a00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22a10 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
22a20 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
22a30 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
22a40 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
22a50 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
22a60 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
22a70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
22a80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22aa0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
22ab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
22ac0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
22ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
22ae0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
22af0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
22b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
22b10 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
22b20 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
22b30 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
22b40 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
22b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22b60 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
22b70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
22b80 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
22b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ba0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
22bb0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
22bc0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
22bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
22be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22bf0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
22c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22c10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
22c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22c30 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
22c40 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
22c50 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
22c60 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
22c70 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
22c80 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
22c90 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
22ca0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
22cb0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
22cc0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
22cd0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
22ce0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
22cf0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
22d00 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
22d10 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
22d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22d30 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
22d40 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
22d50 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
22d60 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
22d70 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
22d80 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
22d90 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
22da0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
22db0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
22dc0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
22dd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
22de0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
22df0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
22e00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22e10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22e30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22e40 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
22e50 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
22e60 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22e70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22e90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22ea0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
22eb0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22ec0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
22ed0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
22ee0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
22ef0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
22f00 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
22f10 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
22f20 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
22f30 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
22f40 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
22f50 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
22f60 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
22f70 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
22f80 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
22f90 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
22fa0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
22fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
22fc0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
22fd0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
22fe0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
22ff0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
23000 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
23010 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
23020 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
23030 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
23040 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
23050 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
23060 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
23070 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
23080 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
23090 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
230a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
230b0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
230c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
230d0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
230e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
230f0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
23100 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
23110 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23120 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
23130 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
23140 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
23150 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23170 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23180 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
23190 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
231a0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
231b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
231c0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
231d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
231e0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
231f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23200 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
23210 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
23220 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
23230 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
23240 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
23260 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23270 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
23280 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
23290 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
232a0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
232b0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
232c0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
232d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
232e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
232f0 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
23300 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
23310 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
23320 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
23330 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
23340 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
23350 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
23360 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
23370 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
23380 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
23390 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
233a0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
233b0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
233c0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
233d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
233e0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
233f0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
23400 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
23410 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
23420 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
23430 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
23440 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
23450 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
23460 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
23470 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
23480 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
23490 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
234a0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
234b0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
234c0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
234d0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
234e0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
234f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
23500 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
23510 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
23520 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
23530 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
23540 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
23550 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
23560 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
23570 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
23580 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
23590 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
235a0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
235b0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
235c0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
235d0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
235e0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
235f0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
23600 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
23610 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
23620 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
23630 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
23640 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
23650 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
23660 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
23670 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
23680 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
23690 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
236a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
236b0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
236c0 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
236d0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
236e0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
236f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23700 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
23710 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23720 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23740 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23750 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
23760 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
23770 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23780 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23790 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
237a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
237b0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
237c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
237d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
237e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
237f0 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  >0 );.  *pAmt = 
23800 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
23810 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  l;.  return (voi
23820 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  d*)pCur->info.pP
23830 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
23840 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
23850 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
23860 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
23870 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
23880 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
23890 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
238a0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
238b0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
238c0 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
238d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
238e0 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
238f0 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
23900 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
23910 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
23920 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
23930 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
23940 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
23950 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
23960 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
23970 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
23980 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
23990 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
239a0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
239b0 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
239c0 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
239d0 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
239e0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
239f0 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
23a00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
23a10 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
23a20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
23a30 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
23a40 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
23a50 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
23a60 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
23a70 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
23a80 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
23a90 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
23aa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23ab0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
23ac0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
23ad0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
23ae0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
23af0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
23b00 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
23b10 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
23b20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
23b30 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
23b40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
23b50 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
23b60 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
23b70 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
23b80 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
23b90 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
23ba0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
23bb0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
23bc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
23bd0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
23be0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
23bf0 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
23c00 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
23c10 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
23c20 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
23c30 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
23c40 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
23c50 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
23c60 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
23c70 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
23c80 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
23c90 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
23ca0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
23cb0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
23cc0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
23cd0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
23ce0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
23cf0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
23d00 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
23d10 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
23d20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
23d30 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
23d40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23d50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23d60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23d70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23d80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
23d90 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
23da0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
23db0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23dc0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
23dd0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
23de0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
23df0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
23e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23e10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
23e20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
23e30 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
23e40 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20  , &pNewPage,.   
23e50 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
23e60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
23e70 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
23e80 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
23e90 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66  DONLY : 0);.  if
23ea0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23eb0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
23ec0 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
23ed0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
23ee0 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
23ef0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
23f00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23f10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
23f20 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
23f30 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
23f40 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
23f50 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
23f60 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
23f70 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
23f80 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
23f90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
23fa0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
23fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
23fd0 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50   0./*.** Page pP
23fe0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
23ff0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
24000 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
24010 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
24020 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
24030 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
24040 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
24050 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
24060 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
24070 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
24080 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
24090 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
240a0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
240b0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
240c0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
240d0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
240e0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
240f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
24100 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
24110 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
24120 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
24130 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
24140 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
24150 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
24160 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
24170 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
24180 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
24190 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
241a0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
241b0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
241c0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
241d0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
241e0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
241f0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
24200 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
24210 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
24220 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
24230 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
24240 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
24250 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
24260 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
24270 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
24280 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
24290 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
242a0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
242b0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
242c0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
242d0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
242e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
242f0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
24300 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
24310 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
24320 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
24330 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
24340 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
24350 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
24360 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
24370 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
24380 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24390 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
243a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
243b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
243c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
243d0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
243e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
243f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
24400 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a  );..  /* UPDATE:
24410 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   It is actually 
24420 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
24430 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65   condition teste
24440 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a  d by the assert.
24450 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65    ** below to be
24460 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64   untrue if the d
24470 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
24480 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61  corrupt. This ca
24490 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20  n occur if.  ** 
244a0 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  one cursor has m
244b0 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61  odified page pPa
244c0 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66  rent while a ref
244d0 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20  erence to it is 
244e0 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20  held .  ** by a 
244f0 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57  second cursor. W
24500 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
24510 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65  ppen if a single
24520 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a   page is linked.
24530 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74    ** into more t
24540 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
24550 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f  tructure in a co
24560 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
24570 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
24580 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
24590 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
245a0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
245b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
245c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
245d0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
245e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
245f0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69  >pgno.  );.#endi
24600 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  f.  testcase( pC
24610 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24620 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
24630 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24640 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
24650 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
24660 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24670 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
24680 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
24690 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
246a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
246b0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
246c0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
246d0 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a  alidOvfl);.}../*
246e0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
246f0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
24700 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
24710 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
24720 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
24730 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
24740 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
24750 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
24760 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
24770 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
24780 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
24790 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
247a0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
247b0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
247c0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
247d0 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
247e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
247f0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
24800 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
24810 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
24820 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
24830 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
24840 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
24850 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
24860 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
24870 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
24880 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
24890 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
248a0 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
248b0 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
248c0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
248d0 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
248e0 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
248f0 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
24900 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
24910 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
24920 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
24930 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
24940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
24950 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
24960 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
24970 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
24980 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
24990 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
249a0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
249b0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
249c0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
249d0 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
249e0 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
249f0 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
24a00 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
24a10 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
24a20 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
24a30 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
24a40 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
24a50 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
24a60 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
24a70 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
24a80 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
24a90 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
24aa0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
24ab0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
24ac0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
24ad0 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
24ae0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
24af0 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
24b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
24b10 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
24b20 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
24b30 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
24b40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24b50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24b60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24b70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24b80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
24b90 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
24ba0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
24bb0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
24bc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24bd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24be0 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
24bf0 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
24c00 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
24c10 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
24c20 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
24c30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
24c40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24c50 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
24c60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
24c70 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
24c80 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
24c90 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
24ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
24cb0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
24cc0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
24cd0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
24ce0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  e>=0 ){.    whil
24cf0 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  e( pCur->iPage )
24d00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24d10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24d20 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c  iPage--]);.  }el
24d30 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
24d40 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
24d50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24d60 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
24d70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24d80 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
24d90 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
24da0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
24db0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
24dc0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
24dd0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
24de0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
24df0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
24e00 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
24e10 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
24e20 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
24e30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24e40 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
24e50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24e60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24e80 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
24e90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f   = 0;.  }.  pRoo
24ea0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
24eb0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
24ec0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
24ed0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
24ee0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
24ef0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
24f00 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
24f10 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
24f20 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
24f30 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
24f40 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
24f50 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
24f60 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
24f70 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
24f80 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
24f90 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
24fa0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24fb0 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
24fc0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
24fd0 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
24fe0 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
24ff0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
25000 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
25010 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
25020 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
25030 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
25040 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
25050 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
25060 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
25070 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
25080 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
25090 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
250a0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
250b0 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
250c0 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
250d0 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
250e0 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
250f0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
25100 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
25110 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
25120 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25130 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
25140 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
25150 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
25160 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
25170 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
25180 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
25190 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
251a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
251b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
251c0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
251d0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
251e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
251f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
25200 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
25210 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
25220 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
25230 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
25240 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
25250 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25260 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
25270 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
25280 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
25290 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
252a0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
252b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
252c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
252d0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
252e0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
252f0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
25300 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
25310 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
25320 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
25330 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
25340 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
25350 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
25360 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
25370 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
25380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25390 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
253a0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
253b0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
253c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
253d0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
253e0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
253f0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
25400 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
25410 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
25420 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
25430 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
25440 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
25450 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
25460 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
25470 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
25480 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
25490 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
254a0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
254b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
254c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
254d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
254e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
254f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25500 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
25510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25520 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
25530 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25540 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
25550 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25560 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25570 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
25580 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
25590 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
255a0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
255b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
255c0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
255d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
255e0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
255f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25600 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
25610 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
25620 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
25630 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
25640 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
25650 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
25660 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
25670 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
25680 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
25690 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
256a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
256b0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
256c0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
256d0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
256e0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
256f0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
25700 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
25710 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
25720 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
25730 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
25740 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
25750 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
25760 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
25770 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
25780 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
25790 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
257a0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
257b0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
257c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
257d0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
257e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
257f0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
25800 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
25810 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25820 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25830 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25840 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25850 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
25860 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
25870 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25880 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
25890 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
258a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
258b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
258c0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
258d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
258e0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
258f0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
25900 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
25910 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
25920 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25930 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
25940 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
25950 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
25960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
25970 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
25980 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
25990 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
259a0 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
259b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
259c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
259d0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
259e0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
259f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
25a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
25a10 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
25a20 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
25a30 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
25a40 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
25a50 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
25a60 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
25a70 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
25a80 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
25a90 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
25aa0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
25ab0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
25ac0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
25ad0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25ae0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25af0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
25b00 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
25b10 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
25b20 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
25b30 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
25b40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25b50 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
25b60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
25b70 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
25b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25b90 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25ba0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25bb0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
25bc0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25bd0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
25be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
25bf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25c00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
25c10 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25c20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25c30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
25c40 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
25c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25c60 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25c70 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
25c80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
25c90 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
25ca0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
25cb0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
25cc0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
25cd0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
25ce0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
25cf0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
25d00 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
25d10 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
25d20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
25d30 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
25d40 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
25d50 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
25d60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25d70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25d90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
25da0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
25db0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
25dc0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
25dd0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
25de0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
25df0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
25e00 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
25e10 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25e20 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
25e30 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
25e40 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
25e50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
25e60 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
25e70 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
25e80 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
25e90 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
25ea0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
25eb0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
25ec0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
25ed0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
25ee0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
25ef0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
25f00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
25f10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
25f20 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
25f30 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
25f40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
25f50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25f60 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
25f70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25f80 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
25f90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25fa0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25fb0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
25fc0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
25fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
25fe0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
25ff0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
26000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26010 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
26020 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
26030 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
26040 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
26050 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
26060 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26070 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
26080 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
26090 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
260a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
260b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
260c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
260d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
260e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
260f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
26100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26120 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
26130 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
26140 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26150 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
26160 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
26170 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
26180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
26190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
261a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
261b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
261c0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
261d0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
261e0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
261f0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
26200 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
26210 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
26220 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
26230 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
26240 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
26250 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
26260 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
26270 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
26280 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
26290 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
262a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
262b0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
262c0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
262d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
262e0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
262f0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
26300 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
26310 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
26320 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
26330 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
26340 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
26350 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
26360 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
26370 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
26380 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
26390 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
263a0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
263b0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
263c0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
263d0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
263e0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
263f0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
26400 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
26410 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
26420 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
26430 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
26440 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
26450 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
26460 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
26470 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
26480 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
264b0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
264c0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
264d0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
264f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
26500 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
26510 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
26520 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
26530 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
26540 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
26550 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
26560 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
26570 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
26580 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
26590 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
265a0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
265b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
265c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
265d0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
26600 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
26610 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
26620 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
26630 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
26640 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
26650 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
26660 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
26670 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
26680 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
26690 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
266a0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
266b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
266c0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
266d0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
266e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
266f0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
26700 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
26710 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
26720 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
26730 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
26740 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
26750 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
26760 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
26770 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
26780 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26790 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
267a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
267b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
267c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
267d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
267e0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
267f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
26800 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
26810 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
26820 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
26830 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
26840 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
26850 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
26860 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
26870 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
26880 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
26890 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
268a0 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
268b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
268c0 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
268d0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
268e0 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
268f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
26900 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
26910 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
26920 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
26930 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
26940 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
26950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
26960 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
26970 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26980 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43  AtLast)!=0 && pC
26990 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
269a0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
269b0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
269c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
269d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
269e0 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
269f0 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
26a00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
26a10 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
26a20 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
26a30 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
26a40 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
26a50 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
26a60 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
26a70 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
26a80 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
26a90 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
26aa0 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
26ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
26ac0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
26ad0 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
26ae0 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
26af0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
26b00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
26b10 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
26b20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
26b30 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
26b40 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
26b50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26b60 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
26b70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
26b80 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
26b90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26ba0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
26bb0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
26bc0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
26bd0 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
26be0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26bf0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
26c00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26c10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
26c20 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
26c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
26c40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26c50 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26c60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
26c70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
26c80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26c90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
26ca0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
26cb0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
26cc0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
26cd0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
26ce0 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
26cf0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
26d00 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
26d10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26d20 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
26d30 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
26d60 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
26d70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
26d80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
26d90 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
26da0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
26db0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
26dc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
26dd0 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
26de0 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
26df0 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
26e00 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
26e10 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
26e20 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
26e30 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
26e40 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
26e50 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
26e60 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
26e70 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
26e80 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
26e90 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
26ea0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
26eb0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
26ec0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
26ed0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
26ee0 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
26ef0 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
26f00 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
26f10 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
26f20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
26f30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26f40 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
26f50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26f60 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
26f70 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
26f80 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
26f90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
26fa0 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
26fb0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
26fc0 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
26fd0 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
26fe0 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
26ff0 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
27000 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
27010 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61  ; */.    pCur->a
27020 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27030 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
27040 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
27050 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
27060 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
27070 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
27080 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
27090 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
270a0 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
270b0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
270c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
270d0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
270e0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
270f0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
27100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27110 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
27120 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
27130 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27140 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
27150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27160 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
27170 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
27180 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
27190 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
271a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
271b0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
271c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
271d0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
271e0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
271f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
27200 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
27210 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
27220 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
27230 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
27240 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
27250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27260 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27270 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
27280 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
27290 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
272a0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
272b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
272c0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
272d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
272e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
272f0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27300 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
27310 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
27320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27330 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
27340 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
27350 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
27360 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27370 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
27380 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
27390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
273a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
273b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
273c0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
273d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
273e0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
273f0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
27400 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
27410 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
27420 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
27430 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
27440 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
27450 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
27460 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
27470 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
27480 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
27490 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20  childPtrSize;.. 
274a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
274b0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
274c0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
274d0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
274e0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
274f0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
27500 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
27510 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
27520 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
27530 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
27540 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
27550 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
27560 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
27570 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
27580 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
27590 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
275a0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
275b0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
275c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
275d0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
275e0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
275f0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
27600 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
27610 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
27620 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
27630 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
27640 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
27650 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
27660 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
27670 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
27680 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
27690 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
276a0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
276b0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
276c0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
276d0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
276e0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
276f0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
27700 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
27710 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
27720 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
27730 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
27740 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
27750 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
27760 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
27770 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
27780 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
27790 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
277a0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
277b0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
277c0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
277d0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
277e0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
277f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
27800 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
27810 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
27820 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
27830 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
27840 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
27850 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
27860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
27870 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
27880 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
27890 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
278a0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
278b0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
278c0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
278d0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
278e0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
278f0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
27900 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
27910 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
27920 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
27930 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
27940 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
27950 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
27960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27970 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
27980 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
27990 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
279a0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
279b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
279c0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
279d0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
279e0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
279f0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
27a00 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
27a10 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
27a20 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
27a30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
27a40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
27a50 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
27a60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
27a70 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
27a80 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
27a90 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
27aa0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
27ab0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
27ac0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
27ad0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
27ae0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
27af0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
27b00 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
27b10 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
27b20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
27b30 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
27b40 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
27b50 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
27b60 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
27b70 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
27b80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
27b90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27ba0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
27bb0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
27bc0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
27bd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
27be0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27bf0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
27c00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
27c10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
27c20 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
27c30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
27c40 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
27c50 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
27c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27c70 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
27c80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
27c90 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
27ca0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
27cb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
27cc0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
27cd0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
27ce0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
27cf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27d00 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
27d10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
27d20 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
27d30 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
27d40 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
27d50 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
27d60 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
27d70 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
27d80 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
27d90 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
27da0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
27db0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
27dc0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
27dd0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
27de0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
27df0 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
27e00 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
27e10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27e20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27e30 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
27e40 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27e50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
27e60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
27e70 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27e80 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27e90 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
27ea0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
27eb0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
27ec0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
27ed0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
27ee0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
27ef0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
27f00 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
27f10 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
27f20 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
27f30 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
27f40 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
27f50 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
27f60 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
27f70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
27f80 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
27f90 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
27fa0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
27fb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27fc0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
27fd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
27fe0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
27ff0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
28000 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
28010 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28020 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
28030 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
28040 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
28050 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
28060 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
28070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28080 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
28090 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
280a0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
280b0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
280c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
280d0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
280e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
280f0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
28100 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
28110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
28120 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
28130 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
28140 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
28150 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28160 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
28170 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
28180 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
28190 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
281a0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
281b0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
281c0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
281d0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
281e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
281f0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
28200 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
28210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28220 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
28230 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
28240 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
28250 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
28260 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
28270 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
28280 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
28290 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
282a0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
282b0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
282c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
282d0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
282e0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
282f0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
28300 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
28310 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
28320 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
28330 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
28340 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
28350 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28360 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
28370 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
28380 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
28390 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
283a0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
283b0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
283c0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
283d0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
283e0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
283f0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
28400 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
28410 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
28420 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
28430 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
28440 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
28450 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
28460 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
28470 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
28480 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
28490 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
284a0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
284b0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
284c0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
284d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
284e0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
284f0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
28500 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
28510 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
28520 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
28530 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
28540 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
28550 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
28560 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
28570 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
28580 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
28590 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
285a0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
285b0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
285c0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
285d0 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
285e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
285f0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
28600 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
28610 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
28620 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
28630 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
28640 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
28650 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
28660 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
28670 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
28680 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
28690 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
286a0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
286b0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
286c0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
286d0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
286e0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
286f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
28700 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
28710 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
28720 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
28730 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
28740 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
28750 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
28760 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
28770 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
28780 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
28790 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
287a0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
287b0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
287c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
287d0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
287e0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
287f0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
28800 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
28810 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
28820 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
28830 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
28840 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
28850 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
28860 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
28870 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
28880 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
28890 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
288a0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
288b0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
288c0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
288d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
288e0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
288f0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
28900 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
28910 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28920 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28930 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28940 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
28950 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
28960 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28970 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
28980 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
28990 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
289a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
289b0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
289c0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
289d0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
289e0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
289f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
28a00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28a20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28a30 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
28a40 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
28a50 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
28a60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
28a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28a80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
28a90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28aa0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28ab0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28ac0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
28ad0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28ae0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
28af0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
28b00 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
28b10 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
28b20 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
28b30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
28b40 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
28b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28b60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
28b70 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
28b80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
28b90 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
28ba0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28bb0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
28bc0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
28bd0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28be0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
28bf0 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
28c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28c10 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
28c20 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
28c30 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
28c40 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
28c50 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
28c60 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
28c70 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
28c80 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
28c90 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
28ca0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28cb0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
28cc0 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
28cd0 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
28ce0 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
28cf0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
28d00 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
28d10 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
28d20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
28d30 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
28d40 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
28d50 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
28d60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
28d70 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
28d80 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
28d90 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28da0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
28db0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
28dc0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
28dd0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
28de0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
28df0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
28e00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
28e10 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
28e20 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
28e30 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
28e40 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
28e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
28e60 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
28e70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28e80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28eb0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
28ec0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
28ed0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
28ee0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28ef0 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
28f00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28f10 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
28f20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
28f30 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
28f40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28f50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
28f60 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
28f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28fa0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
28fb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28fc0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
28fd0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
28fe0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
28ff0 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
29000 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
29010 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
29020 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
29030 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
29040 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29050 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29060 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
29070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
29080 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
29090 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
290a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
290b0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
290c0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
290d0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
290e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
290f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29100 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29110 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29120 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
29130 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
29140 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
29150 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
29160 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
29170 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29180 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29190 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
291a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
291b0 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  age])>=pPage->nC
291c0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
291d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
291e0 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  ge]--;.    retur
291f0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
29200 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69  , pRes);.  }.  i
29210 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
29220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29230 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29240 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
29250 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
29260 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
29270 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
29280 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
29290 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
292a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
292b0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
292c0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
292d0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
292e0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
292f0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
29300 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
29310 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
29320 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
29330 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
29340 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
29350 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
29360 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
29370 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
29380 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
29390 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
293a0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
293b0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
293c0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
293d0 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
293e0 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
293f0 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
29400 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
29410 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
29420 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
29430 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
29440 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
29450 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
29460 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
29470 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
29480 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
29490 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
294a0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
294b0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
294c0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
294d0 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
294e0 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
294f0 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
29500 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
29510 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
29520 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
29530 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
29540 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
29550 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
29560 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
29570 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
29580 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
29590 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
295a0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
295b0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
295c0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
295d0 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
295e0 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
295f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29600 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
29610 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
29620 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
29630 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
29640 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
29650 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
29660 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
29670 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
29680 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
29690 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
296a0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
296b0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
296c0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
296d0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
296e0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
296f0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
29700 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29710 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29720 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
29730 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
29740 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29750 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29760 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
29770 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
29780 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
29790 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
297a0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
297b0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
297c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
297d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
297e0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
297f0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
29800 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
29810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29820 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
29830 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
29840 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
29850 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
29860 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
29870 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
29880 45 45 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  EEK );.    rc = 
29890 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
298a0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
298b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
298c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
298d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
298e0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
298f0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
29900 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
29910 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
29920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29930 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
29940 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
29950 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29960 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29970 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
29980 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29990 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
299a0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
299b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
299c0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
299d0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
299e0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
299f0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
29a00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29a10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
29a20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
29a30 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
29a40 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
29a50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29a60 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
29a70 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
29a80 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
29a90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
29aa0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
29ab0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29ac0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
29ad0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
29ae0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
29af0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
29b00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29b10 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
29b20 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
29b30 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
29b40 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
29b50 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29b60 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
29b70 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
29b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
29b90 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29ba0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
29bb0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
29bc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
29bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
29be0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
29bf0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
29c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29c10 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
29c20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29c30 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
29c40 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
29c50 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
29c60 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
29c70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29c80 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
29c90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29ca0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
29cb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
29cc0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
29cd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
29ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
29cf0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
29d00 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
29d10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29d20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29d30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29d40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29d50 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
29d60 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
29d70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
29d80 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
29d90 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29da0 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
29db0 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
29dc0 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
29dd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29de0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
29df0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
29e00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29e10 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
29e20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
29e30 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
29e40 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
29e50 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
29e60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
29e70 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
29e80 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29e90 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
29ea0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29eb0 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
29ec0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29ed0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
29ee0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
29ef0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
29f00 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
29f10 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29f20 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
29f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
29f50 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
29f60 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29f70 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
29f80 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
29f90 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
29fa0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29fb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29fc0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
29fd0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
29fe0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
29ff0 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2a000 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2a010 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2a020 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2a030 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2a040 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2a050 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2a060 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2a070 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2a080 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2a090 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a0a0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2a0b0 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2a0c0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2a0d0 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2a0e0 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
2a0f0 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
2a100 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2a110 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
2a120 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
2a130 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2a140 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
2a150 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2a170 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2a180 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2a190 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2a1a0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2a1b0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2a1c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a1d0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2a1e0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2a1f0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2a200 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2a210 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2a220 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2a230 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2a240 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2a250 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2a260 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2a270 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2a280 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2a290 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2a2a0 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2a2b0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2a2c0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2a2d0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2a2e0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2a2f0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2a300 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2a310 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2a320 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2a330 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2a340 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2a350 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2a360 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2a370 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2a380 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2a390 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2a3a0 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2a3b0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2a3c0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a3d0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2a3e0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2a3f0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2a400 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2a410 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2a420 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2a430 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2a440 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2a450 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2a460 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2a470 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2a480 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2a490 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2a4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2a4b0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2a4c0 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2a4d0 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2a4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2a4f0 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2a500 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2a510 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2a520 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2a530 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2a540 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2a550 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2a560 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2a570 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2a580 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2a590 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2a5a0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2a5b0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2a5c0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2a5d0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2a5e0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2a5f0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2a600 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2a610 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2a620 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a630 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2a640 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2a650 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2a660 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2a670 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2a680 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2a690 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2a6a0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2a6b0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2a6c0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
2a6d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a6e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2a6f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2a700 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2a710 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2a720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a730 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a740 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2a750 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2a760 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2a770 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2a780 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2a790 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2a7a0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2a7b0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2a7c0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2a7d0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2a7e0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2a7f0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2a800 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2a810 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2a820 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2a830 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2a840 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2a850 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2a860 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2a870 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2a880 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2a890 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2a8a0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2a8b0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2a8c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a8d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2a8e0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2a8f0 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2a900 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2a910 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2a920 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2a930 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2a940 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2a950 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2a960 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2a970 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2a980 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2a990 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2a9a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a9b0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2a9c0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2a9d0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2a9e0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2a9f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2aa00 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2aa10 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2aa20 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2aa30 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2aa40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2aa50 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2aa60 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2aa70 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2aa80 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2aa90 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2aaa0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2aab0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2aac0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2aad0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2aae0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2aaf0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2ab00 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2ab10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ab20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2ab30 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2ab40 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2ab50 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2ab60 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2ab70 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2ab80 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2ab90 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2aba0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2abb0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2abc0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2abd0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2abe0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2abf0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2ac00 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2ac10 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2ac20 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2ac30 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2ac40 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2ac50 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2ac60 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2ac70 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2ac80 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2ac90 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2aca0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2acb0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
2acc0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2acd0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2ace0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2acf0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
2ad00 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2ad10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2ad20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ad30 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2ad40 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2ad50 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2ad60 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2ad70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ad80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2ad90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2ada0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2adb0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2adc0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2add0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2ade0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2adf0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2ae00 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2ae10 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2ae20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2ae30 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2ae40 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2ae50 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20  aData!=0 );..   
2ae60 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2ae70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2ae80 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76  ]); /* # of leav
2ae90 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
2aea0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2aeb0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2aec0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2aed0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2aee0 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2aef0 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2af00 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2af10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2af20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2af30 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2af40 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2af50 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2af60 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2af70 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2af80 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2af90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2afa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2afb0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2afc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2afd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2afe0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2aff0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2b000 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2b010 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2b020 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b030 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b040 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b050 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2b060 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b070 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2b080 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2b090 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2b0a0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2b0b0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2b0c0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2b0d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b0e0 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2b0f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2b100 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2b110 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2b120 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2b130 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2b140 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b150 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b160 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2b170 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b180 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2b190 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2b1a0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2b1b0 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2b1c0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2b1d0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2b1e0 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2b1f0 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2b200 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2b210 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2b220 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2b230 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2b240 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2b250 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2b260 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2b270 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2b280 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2b290 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2b2a0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2b2b0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2b2c0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b2d0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2b2e0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2b2f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b300 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2b310 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b320 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b330 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b340 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b360 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2b370 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2b380 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2b390 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b3a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b3b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b3c0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b3e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b3f0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2b400 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2b410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b440 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b450 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b470 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2b480 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2b490 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b4a0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b4b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2b4d0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2b4e0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2b4f0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2b500 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2b510 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2b520 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2b530 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2b540 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2b550 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2b560 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2b570 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2b580 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2b590 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2b5a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2b5b0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2b5c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2b5d0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2b5e0 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2b5f0 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2b600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b610 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2b620 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2b630 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b640 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2b650 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b660 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2b670 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2b680 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2b690 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2b6a0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2b6b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2b6c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2b6e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b6f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2b700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2b710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b720 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2b730 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b770 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2b780 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2b790 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2b7a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b7b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2b7c0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2b7d0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2b7e0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2b7f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2b800 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2b810 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2b820 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2b830 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2b840 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2b850 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2b860 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b870 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2b880 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2b890 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2b8a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b8b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b8c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
2b8d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2b8e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2b8f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2b900 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
2b910 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b920 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2b930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b940 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2b950 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2b960 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2b970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b980 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b990 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2b9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b9b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
2b9c0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2b9d0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2b9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b9f0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
2ba00 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2ba10 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2ba20 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2ba30 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2ba40 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2ba50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2ba60 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
2ba70 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
2ba80 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
2ba90 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
2baa0 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
2bab0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
2bac0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
2bad0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
2bae0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
2baf0 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
2bb00 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
2bb10 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
2bb20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2bb30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2bb40 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2bb50 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
2bb60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
2bb70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2bb80 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2bb90 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2bba0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
2bbb0 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
2bbc0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
2bbd0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2bbe0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2bbf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bc00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2bc10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bc20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bc30 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
2bc40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2bc50 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
2bc60 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2bc70 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
2bc80 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2bc90 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
2bca0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2bcb0 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
2bcc0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2bcd0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2bce0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2bd00 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
2bd10 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2bd20 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2bd30 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
2bd40 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2bd50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2bd60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2bd70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bd80 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2bd90 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2bda0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2bdb0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2bdc0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2bdd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2bde0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2bdf0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2be00 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2be10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2be20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2be30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2be40 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2be50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2be60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2be70 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2be80 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2be90 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2bea0 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2beb0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2bec0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2bed0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2bee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bef0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2bf00 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2bf10 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2bf20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2bf30 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2bf40 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2bf50 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2bf60 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2bf70 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2bf80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2bf90 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2bfa0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2bfb0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2bfc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2bfd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bfe0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2bff0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c000 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2c010 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2c020 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2c030 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2c040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2c050 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2c060 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2c070 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2c080 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2c090 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2c0a0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2c0b0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2c0c0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2c0d0 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
2c0e0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
2c0f0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
2c100 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c110 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2c120 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
2c130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c160 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c170 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2c180 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2c190 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c1a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c1b0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2c1c0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2c1d0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c1e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c1f0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2c200 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2c210 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
2c220 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2c230 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
2c240 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
2c250 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
2c260 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c270 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
2c280 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2c290 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
2c2a0 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
2c2b0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2c2c0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
2c2d0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
2c2e0 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
2c2f0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
2c300 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
2c310 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
2c320 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
2c330 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
2c340 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
2c350 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
2c360 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2c370 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
2c380 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
2c390 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
2c3a0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
2c3b0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
2c3c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2c3d0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
2c3e0 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
2c3f0 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
2c400 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
2c410 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
2c420 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
2c430 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
2c440 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
2c450 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
2c460 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
2c470 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
2c480 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
2c490 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
2c4a0 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
2c4b0 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
2c4c0 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
2c4d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
2c4e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2c4f0 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
2c500 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
2c510 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
2c520 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
2c530 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
2c540 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
2c550 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
2c560 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
2c570 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
2c580 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
2c590 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2c5a0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2c5b0 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
2c5c0 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
2c5d0 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
2c5e0 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
2c5f0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2c600 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
2c610 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
2c620 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
2c630 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
2c640 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2c650 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
2c660 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2c670 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2c680 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
2c690 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
2c6a0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
2c6b0 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
2c6c0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
2c6d0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2c6e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2c6f0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2c700 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2c710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c720 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2c730 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
2c740 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2c750 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
2c760 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
2c770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2c780 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2c790 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2c7a0 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
2c7b0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
2c7c0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
2c7d0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
2c7e0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
2c7f0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
2c800 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
2c810 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
2c820 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
2c830 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
2c840 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
2c850 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
2c860 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
2c870 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2c880 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
2c890 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2c8a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c8b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
2c8c0 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
2c8d0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2c8e0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
2c8f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2c900 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
2c910 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2c920 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
2c930 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2c940 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
2c950 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2c960 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
2c970 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
2c980 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2c990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c9a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c9b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c9c0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
2c9d0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2c9e0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
2c9f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2ca00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
2ca10 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2ca20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2ca30 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2ca40 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
2ca50 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
2ca60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
2ca70 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
2ca80 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
2ca90 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
2caa0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
2cab0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2cac0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2cad0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2cae0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2caf0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2cb00 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2cb10 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
2cb20 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2cb30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2cb40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2cb50 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2cb60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2cb70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cb80 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2cb90 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2cba0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
2cbb0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2cbc0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
2cbd0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
2cbe0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
2cbf0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2cc00 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
2cc10 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2cc20 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2cc30 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
2cc40 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2cc50 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2cc60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2cc70 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
2cc80 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
2cc90 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
2cca0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
2ccb0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2ccc0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
2ccd0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2cce0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ccf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2cd00 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
2cd10 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
2cd20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2cd30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
2cd40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2cd50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2cd60 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
2cd70 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
2cd80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2cd90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2cda0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
2cdb0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
2cdc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cdd0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
2cde0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2cdf0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2ce00 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
2ce10 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
2ce20 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
2ce30 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2ce40 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2ce50 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2ce60 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
2ce70 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
2ce80 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
2ce90 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
2cea0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2ceb0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
2cec0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
2ced0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
2cee0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
2cef0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
2cf00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
2cf10 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
2cf20 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
2cf30 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
2cf40 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
2cf50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2cf60 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
2cf70 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
2cf80 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
2cf90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2cfa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
2cfb0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
2cfc0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
2cfd0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
2cfe0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2cff0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2d000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d010 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d020 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
2d030 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d050 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
2d060 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d070 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
2d080 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2d090 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
2d0a0 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
2d0b0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2d0c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
2d0f0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
2d100 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
2d110 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d130 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d140 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
2d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d160 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2d170 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2d180 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
2d190 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2d1a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d1b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d1c0 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
2d1d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
2d1e0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
2d1f0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
2d200 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
2d210 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2d220 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2d230 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2d240 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2d260 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2d270 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2d280 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2d290 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2d2a0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2d2b0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2d2c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d2d0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2d2e0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2d2f0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d300 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2d310 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d320 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2d330 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d340 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2d350 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2d360 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2d370 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2d380 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2d390 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2d3a0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2d3b0 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2d3c0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2d3d0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2d3e0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2d3f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d400 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2d410 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2d420 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2d430 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
2d440 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
2d450 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
2d460 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d470 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
2d480 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
2d490 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2d4a0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2d4b0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
2d4c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
2d4d0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2d4e0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2d4f0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2d500 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2d510 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2d520 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2d530 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2d540 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2d550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2d560 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2d570 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2d580 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2d590 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2d5a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2d5b0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d5c0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2d5d0 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2d5e0 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2d5f0 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2d600 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2d610 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2d620 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2d630 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2d640 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2d650 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2d660 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2d670 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2d680 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2d690 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2d6a0 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2d6b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2d6c0 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2d6d0 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2d6e0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2d6f0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2d700 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2d710 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2d720 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2d730 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2d740 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2d750 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2d760 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2d770 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2d780 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d7a0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2d7b0 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2d7c0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2d7d0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2d7e0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d7f0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2d800 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d810 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2d820 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2d830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d840 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2d850 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2d860 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2d870 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2d880 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2d890 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2d8a0 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2d8b0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2d8c0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2d8d0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2d8e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2d8f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2d900 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2d910 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2d920 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2d930 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2d940 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2d950 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2d960 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2d970 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2d980 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2d990 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2d9a0 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2d9b0 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2d9c0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2d9d0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2d9e0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2d9f0 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2da00 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2da10 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2da20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2da30 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2da40 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2da50 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2da60 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2da70 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2da80 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2da90 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2daa0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2dab0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2dac0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2dad0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2dae0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2daf0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2db00 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2db10 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2db20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2db30 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2db40 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2db50 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2db60 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2db70 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2db80 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2db90 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2dba0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2dbb0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2dbc0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2dbd0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2dbe0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2dbf0 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2dc00 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2dc10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2dc20 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2dc30 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2dc40 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2dc50 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2dc60 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2dc70 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2dc80 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2dc90 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2dca0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2dcb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dcc0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2dcd0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2dce0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2dcf0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2dd00 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2dd10 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
2dd20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2dd30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
2dd40 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
2dd50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2dd60 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
2dd70 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2dd80 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
2dd90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2dda0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2ddb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2ddc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ddd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2dde0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2ddf0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2de00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2de10 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2de20 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2de30 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2de40 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2de50 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2de60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2de70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2de80 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2de90 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2dea0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2deb0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2dec0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2ded0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2dee0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2def0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2df00 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2df10 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2df20 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2df30 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2df40 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2df50 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2df60 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2df70 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2df80 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2df90 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2dfa0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2dfb0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2dfc0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2dfd0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2dfe0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2dff0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2e000 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2e010 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2e020 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2e030 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2e040 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2e050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e060 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2e070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e080 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2e090 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2e0a0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2e0b0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2e0c0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2e0d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2e0e0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2e0f0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e100 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2e110 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2e120 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2e130 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2e140 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2e150 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2e160 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2e170 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2e180 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2e190 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2e1a0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2e1b0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2e1c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e1d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2e1e0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2e1f0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2e200 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2e210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2e220 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2e230 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2e240 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2e250 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2e260 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2e270 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2e280 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2e290 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
2e2a0 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
2e2b0 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
2e2c0 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
2e2d0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
2e2e0 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
2e2f0 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
2e300 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2e310 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
2e320 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2e330 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e340 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2e350 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
2e360 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e370 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
2e380 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
2e390 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
2e3a0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2e3b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
2e3c0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
2e3d0 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
2e3e0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2e3f0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2e400 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2e410 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2e420 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2e430 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2e440 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2e450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e460 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2e470 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2e480 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2e490 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2e4a0 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
2e4b0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
2e4c0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
2e4d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2e4e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
2e4f0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2e500 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
2e510 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2e520 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
2e530 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
2e540 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
2e550 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
2e560 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2e570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e580 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
2e590 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
2e5a0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
2e5b0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2e5c0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2e5d0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2e5e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2e5f0 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2e600 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2e610 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e620 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2e630 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2e640 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2e650 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2e660 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2e670 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2e680 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2e690 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2e6a0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2e6b0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2e6c0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2e6d0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2e6e0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2e6f0 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2e700 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2e710 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2e720 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2e730 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2e740 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2e750 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2e760 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2e770 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2e780 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2e790 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2e7a0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2e7b0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2e7c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e7d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e7e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2e7f0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2e800 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2e810 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2e820 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2e830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2e840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e850 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2e860 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2e870 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2e880 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2e890 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2e8a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2e8b0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2e8c0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2e8d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2e8e0 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2e8f0 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2e900 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2e910 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2e920 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2e930 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2e940 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2e950 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2e960 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2e970 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2e980 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2e990 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2e9a0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2e9b0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2e9c0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2e9d0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2e9e0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2e9f0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2ea00 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2ea10 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2ea20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2ea30 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2ea40 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2ea50 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2ea60 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2ea70 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2ea80 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2ea90 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2eaa0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2eab0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2eac0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2ead0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2eae0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2eaf0 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2eb00 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2eb10 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2eb20 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2eb30 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2eb40 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2eb50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2eb60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2eb70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2eb80 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2eb90 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2eba0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2ebb0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2ebc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2ebd0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2ebe0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ebf0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ec00 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2ec10 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2ec20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ec30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2ec40 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2ec50 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2ec60 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2ec70 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2ec80 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2ec90 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2eca0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2ecb0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2ecc0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2ecd0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2ece0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2ecf0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2ed00 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2ed10 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2ed20 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2ed30 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2ed40 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2ed50 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2ed60 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2ed70 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2ed80 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2ed90 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2eda0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2edb0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2edc0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2edd0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2ede0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2edf0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2ee00 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2ee10 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2ee20 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2ee30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2ee40 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2ee50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee70 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2ee80 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2ee90 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2eea0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2eeb0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2eec0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2eed0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2eee0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2eef0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2ef00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2ef10 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2ef20 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2ef30 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2ef60 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2ef70 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2ef80 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efa0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2efb0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2efc0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2efd0 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2efe0 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2eff0 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2f000 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2f010 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2f020 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2f030 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2f040 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2f050 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f060 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2f070 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2f080 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2f090 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2f0a0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
2f0b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f0c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2f0d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2f0e0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2f0f0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2f100 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2f110 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2f120 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2f130 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2f140 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2f150 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2f160 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2f170 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2f180 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2f190 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2f1a0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2f1b0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2f1c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f1d0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2f1e0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2f1f0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2f200 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
2f210 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2f220 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
2f230 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
2f240 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2f250 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e  KeyLeaf ){.    n
2f260 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2f270 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
2f280 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
2f290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2f2a0 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
2f2b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f2c0 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
2f2d0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2f2e0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2f2f0 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2f300 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
2f310 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2f320 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
2f330 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2f340 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2f350 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2f360 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2f370 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2f380 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2f390 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2f3a0 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2f3b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2f3c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f3d0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2f3e0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2f3f0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2f400 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2f410 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
2f420 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
2f430 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
2f440 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
2f450 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
2f460 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
2f470 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
2f480 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
2f490 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
2f4a0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
2f4b0 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
2f4c0 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
2f4d0 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
2f4e0 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
2f4f0 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
2f500 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
2f510 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
2f520 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2f530 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
2f540 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
2f550 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
2f560 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2f570 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
2f580 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
2f590 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
2f5a0 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
2f5b0 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
2f5c0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
2f5d0 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
2f5e0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
2f5f0 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
2f600 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
2f610 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
2f620 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2f630 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
2f640 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
2f650 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2f660 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
2f670 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
2f680 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
2f690 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
2f6a0 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
2f6b0 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
2f6c0 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
2f6d0 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
2f6e0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
2f6f0 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
2f700 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
2f710 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f730 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
2f740 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
2f750 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2f760 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
2f770 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
2f780 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
2f790 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
2f7a0 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
2f7b0 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
2f7d0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
2f7e0 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
2f7f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
2f800 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
2f810 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
2f820 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
2f830 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
2f840 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
2f850 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
2f860 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
2f870 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2f880 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
2f890 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65 50  info;.    btreeP
2f8a0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2f8b0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2f8c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
2f8d0 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
2f8e0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
2f8f0 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
2f900 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2f910 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2f920 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
2f930 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
2f940 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
2f950 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
2f960 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f970 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
2f980 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
2f990 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2f9a0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
2f9b0 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
2f9c0 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
2f9d0 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
2f9e0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
2f9f0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2fa00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2fa10 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2fa20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fa30 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2fa40 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2fa50 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2fa60 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2fa70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2fa80 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2fa90 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2faa0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2fab0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2fac0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2fad0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2fae0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2faf0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2fb00 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2fb10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2fb20 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2fb30 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2fb40 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2fb50 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2fb60 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2fb70 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2fb80 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2fb90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2fba0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2fbb0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2fbc0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2fbd0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2fbe0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2fbf0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2fc00 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2fc10 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2fc20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2fc30 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2fc40 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2fc50 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2fc60 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2fc70 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2fc80 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2fc90 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2fca0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2fcb0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2fcc0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2fcd0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2fce0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2fcf0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2fd00 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2fd10 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2fd20 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2fd30 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2fd40 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2fd50 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2fd60 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
2fd70 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2fd80 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2fd90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2fda0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2fdb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2fdc0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2fdd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fde0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2fdf0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2fe00 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2fe10 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2fe20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2fe30 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2fe40 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2fe50 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2fe60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2fe70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fe80 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2fe90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2fea0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2feb0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2fec0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2fed0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fee0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2fef0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2ff00 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2ff10 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2ff20 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2ff30 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2ff40 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2ff50 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2ff60 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2ff70 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2ff80 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2ff90 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2ffa0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ffb0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2ffc0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2ffd0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2ffe0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2fff0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
30000 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
30010 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
30020 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
30030 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
30040 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
30050 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
30060 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
30070 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
30080 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
30090 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
300a0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
300b0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
300c0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
300d0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
300e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
300f0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
30100 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
30110 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
30120 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
30130 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
30140 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
30150 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
30160 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
30170 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
30180 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
30190 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
301a0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
301b0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
301c0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
301d0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
301e0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
301f0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
30200 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
30210 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
30220 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
30230 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
30240 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
30250 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
30260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
30270 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
30280 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30290 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
302a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
302b0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
302c0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
302d0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
302e0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
302f0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
30300 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
30310 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
30320 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
30330 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
30340 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
30350 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
30360 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
30370 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
30380 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
30390 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
303a0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
303b0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
303c0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
303d0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
303e0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
303f0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
30400 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
30410 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
30420 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
30430 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
30440 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
30450 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
30460 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
30470 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
30480 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
30490 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
304a0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
304b0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
304c0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
304d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
304e0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
304f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30500 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
30510 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
30520 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
30530 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
30540 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
30550 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
30560 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
30570 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
30580 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
30590 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
305a0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
305b0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
305c0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
305d0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
305e0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
305f0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
30600 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
30610 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
30620 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
30630 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
30640 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
30650 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
30660 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
30670 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
30680 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
30690 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
306a0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
306b0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
306c0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
306d0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
306e0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
306f0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
30700 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
30710 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
30720 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
30730 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
30740 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
30750 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
30760 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
30770 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
30780 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
30790 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
307a0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
307b0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
307c0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
307d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
307e0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
307f0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
30800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30810 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30820 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30830 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
30840 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30850 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
30860 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
30870 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
30880 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
30890 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
308a0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
308b0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
308c0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
308d0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
308e0 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
308f0 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
30900 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
30910 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
30920 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
30930 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
30940 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
30950 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
30960 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
30970 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
30980 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30990 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
309a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
309b0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
309c0 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
309d0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
309e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
309f0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
30a00 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74  --;.  memmove(pt
30a10 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
30a20 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
30a30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
30a40 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
30a50 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
30a60 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
30a70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
30a80 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
30a90 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
30aa0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
30ab0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
30ac0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
30ad0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
30ae0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
30af0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
30b00 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
30b10 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
30b20 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
30b30 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
30b40 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
30b50 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
30b60 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
30b70 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
30b80 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
30b90 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
30ba0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
30bb0 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
30bc0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
30bd0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
30be0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
30bf0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
30c00 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
30c10 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
30c20 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
30c30 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
30c40 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
30c50 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
30c60 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
30c70 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
30c80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
30c90 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
30ca0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
30cb0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
30cc0 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
30cd0 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
30ce0 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
30cf0 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
30d00 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
30d10 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
30d20 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
30d30 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
30d40 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
30d50 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
30d60 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
30d70 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
30d80 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
30d90 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
30da0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
30db0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
30dc0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
30dd0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
30de0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
30df0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
30e00 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
30e10 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
30e20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
30e30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
30e40 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
30e50 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
30e60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30e70 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
30e80 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
30e90 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
30ea0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
30eb0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
30ec0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
30ed0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
30ee0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
30ef0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
30f00 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
30f10 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
30f20 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
30f30 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
30f40 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
30f50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
30f60 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
30f70 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
30f80 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
30f90 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
30fa0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
30fb0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
30fc0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
30fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
30fe0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
30ff0 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
31000 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
31010 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
31020 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
31030 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
31040 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
31050 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
31060 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
31070 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
31080 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
31090 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
310a0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
310b0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
310c0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
310d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69  ge */.  int nSki
310e0 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
310f0 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
31100 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
31110 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
31120 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
31130 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
31140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
31150 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
31160 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
31170 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
31180 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
31190 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
311a0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
311b0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
311c0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
311d0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
311e0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
311f0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
31200 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
31210 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
31220 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31230 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
31240 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
31250 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
31260 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
31270 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
31280 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
31290 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
312a0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
312b0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
312c0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
312d0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
312e0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
312f0 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
31300 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
31310 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
31320 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
31330 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
31340 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
31350 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
31360 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
31370 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
31380 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
31390 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
313a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
313b0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
313c0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
313d0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
313e0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
313f0 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
31400 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
31410 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
31420 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
31430 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
31440 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
31450 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
31460 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
31470 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
31480 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
31490 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
314a0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
314b0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
314c0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
314d0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
314e0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
314f0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
31500 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
31510 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
31520 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
31530 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
31540 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
31550 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
31560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31570 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
31580 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31590 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
315a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
315b0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
315c0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
315d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
315e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
315f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
31600 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
31610 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
31620 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
31630 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
31640 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
31650 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
31660 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
31670 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
31680 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
31690 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
316a0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
316b0 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
316c0 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
316d0 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
316e0 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
316f0 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
31700 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
31710 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
31720 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
31730 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
31740 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
31750 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
31760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
31770 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
31780 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
31790 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
317a0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
317b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
317c0 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
317d0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
317e0 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
317f0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
31800 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
31810 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
31820 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
31830 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
31840 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
31850 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69  [ins+2], &data[i
31860 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20  ns], end-ins);. 
31870 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
31880 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
31890 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
318a0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
318b0 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
318c0 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
318d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
318e0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
318f0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
31900 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
31910 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
31920 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
31930 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31940 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
31950 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
31960 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
31970 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
31980 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
31990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
319a0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
319b0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
319c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
319d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
319e0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
319f0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
31a00 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
31a10 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
31a20 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
31a30 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
31a40 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
31a50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
31a60 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
31a70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31a80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
31a90 20 62 65 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f   be assembled */
31aa0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
31ab0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
31ac0 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
31ad0 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
31ae0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
31af0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
31b00 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
31b10 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
31b20 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
31b30 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
31b40 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
31b50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31b60 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
31b70 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
31b80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
31b90 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
31ba0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
31bb0 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
31bc0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
31bd0 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
31be0 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
31bf0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
31c00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
31c10 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
31c20 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
31c30 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
31c40 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
31c50 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
31c60 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
31c70 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
31c80 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
31c90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
31ca0 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
31cb0 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
31cc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
31cd0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
31ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31cf0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
31d00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31d10 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
31d20 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
31d30 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
31d40 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
31d50 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
31d60 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
31d70 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
31d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31d90 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
31da0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
31db0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
31dc0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
31dd0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
31de0 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
31df0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
31e00 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
31e10 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
31e20 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
31e30 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
31e40 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67  pCellptr = &pPag
31e50 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  e->aCellIdx[nCel
31e60 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
31e70 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
31e80 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
31e90 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36  0; i--){.    u16
31ea0 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a   sz = aSize[i];.
31eb0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
31ec0 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
31ed0 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62  -= sz;.    put2b
31ee0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
31ef0 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
31f00 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
31f10 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
31f20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62  sz);.  }.  put2b
31f30 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
31f40 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  , nCell);.  put2
31f50 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
31f60 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
31f70 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
31f80 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62  (nCell*2 + nUsab
31f90 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  le - cellbody);.
31fa0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
31fb0 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
31fc0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
31fd0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
31fe0 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
31ff0 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
32000 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
32010 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
32020 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
32030 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
32040 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
32050 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
32060 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
32070 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
32080 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
32090 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
320a0 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
320b0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
320c0 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
320d0 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
320e0 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
320f0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
32100 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
32110 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
32120 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
32130 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
32140 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
32150 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
32160 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
32170 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
32180 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
32190 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
321a0 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
321b0 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
321c0 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
321d0 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
321e0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
321f0 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
32200 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
32210 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
32220 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
32230 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
32240 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
32250 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
32260 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
32270 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
32280 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
32290 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
322a0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
322b0 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
322c0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
322d0 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
322e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
322f0 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
32300 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
32310 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
32320 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
32330 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
32340 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
32350 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
32360 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
32370 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
32380 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
32390 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
323a0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
323b0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
323c0 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74  tead of trying t
323d0 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  o balance the 3 
323e0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
323f0 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
32400 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
32410 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
32420 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
32430 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
32440 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
32450 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
32460 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
32470 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
32480 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
32490 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
324a0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
324b0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
324c0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
324d0 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
324e0 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
324f0 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
32500 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
32510 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
32520 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
32530 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
32540 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
32550 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
32560 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
32570 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
32580 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
32590 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
325a0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
325b0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
325c0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
325d0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
325e0 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
325f0 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
32600 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
32610 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
32620 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
32630 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
32640 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
32650 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
32660 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
32670 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
32680 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
32690 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
326a0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
326b0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
326c0 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
326d0 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
326e0 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
326f0 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
32700 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
32710 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
32720 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
32730 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
32740 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
32750 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
32760 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
32770 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
32780 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
32790 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
327a0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
327b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
327c0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
327d0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
327e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32800 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
32810 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
32820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32830 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32840 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
32850 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32860 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32870 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32880 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32890 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
328a0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
328b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
328c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
328d0 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
328e0 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f  /* This error co
328f0 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63  ndition is now c
32900 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
32910 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e  eaching this fun
32920 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
32930 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
32940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
32950 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
32960 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
32970 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
32980 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
32990 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
329a0 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
329b0 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
329c0 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
329d0 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
329e0 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
329f0 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
32a00 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
32a10 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
32a20 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
32a30 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
32a40 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32a50 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
32a60 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
32a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32a80 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
32a90 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
32aa0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
32ab0 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
32ac0 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
32ad0 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
32ae0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
32af0 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
32b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
32b10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
32b20 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
32b30 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
32b40 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
32b50 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
32b60 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
32b70 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
32b80 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
32b90 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
32ba0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
32bb0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
32bc0 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
32bd0 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
32be0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
32bf0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
32c00 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
32c10 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
32c20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
32c30 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
32c40 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
32c50 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
32c60 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
32c70 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
32c80 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
32c90 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
32ca0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
32cb0 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
32cc0 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
32cd0 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
32ce0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
32cf0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
32d00 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
32d10 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
32d20 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
32d30 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
32d40 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
32d50 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
32d60 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
32d70 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
32d80 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
32d90 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
32da0 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
32db0 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
32dc0 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
32dd0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
32de0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
32df0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
32e00 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
32e10 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
32e20 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
32e30 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
32e40 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
32e50 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
32e60 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
32e70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
32e80 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
32e90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32ea0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
32eb0 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
32ec0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
32ed0 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
32ee0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
32ef0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
32f00 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
32f10 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
32f20 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
32f30 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
32f40 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
32f50 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
32f60 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
32f70 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
32f80 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
32f90 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
32fa0 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
32fb0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
32fc0 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
32fd0 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
32fe0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
32ff0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
33000 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
33010 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
33020 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
33030 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
33040 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
33050 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
33060 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
33070 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
33080 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
33090 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
330a0 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
330b0 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
330c0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
330d0 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
330e0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
330f0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
33100 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
33110 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
33120 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
33130 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
33140 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
33150 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
33160 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
33170 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
33180 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
33190 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
331a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
331b0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
331c0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
331d0 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
331e0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
331f0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
33200 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
33210 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
33220 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
33230 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
33240 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
33250 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
33260 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
33270 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
33280 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
33290 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
332a0 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
332b0 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
332c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
332d0 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
332e0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
332f0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
33300 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
33310 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
33320 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
33330 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
33340 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
33350 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
33360 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
33370 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
33380 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
33390 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
333a0 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
333b0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
333c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
333d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
333e0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
333f0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
33400 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
33410 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
33420 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
33430 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
33440 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
33450 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
33460 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
33470 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
33480 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
33490 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
334a0 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
334b0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
334c0 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
334d0 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
334e0 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
334f0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
33500 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
33510 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
33520 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
33530 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
33540 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
33550 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
33560 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
33570 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
33580 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
33590 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
335a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
335b0 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
335c0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
335d0 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
335e0 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
335f0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
33600 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
33610 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
33620 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
33630 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
33640 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
33650 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
33660 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
33670 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
33680 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
33690 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
336a0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
336b0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
336c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
336d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
336e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
336f0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
33700 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
33710 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
33720 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
33730 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
33740 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
33750 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
33760 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
33770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33780 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
33790 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
337a0 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
337b0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
337c0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
337d0 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
337e0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
337f0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
33800 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
33810 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
33820 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
33830 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
33840 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
33850 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33860 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
33870 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
33880 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
33890 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
338a0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
338b0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
338c0 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
338d0 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
338e0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
338f0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
33900 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
33910 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
33920 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
33930 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
33940 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
33950 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
33960 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
33970 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
33980 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
33990 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
339a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
339b0 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
339c0 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
339d0 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
339e0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
339f0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
33a00 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
33a10 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
33a20 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
33a30 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
33a40 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
33a50 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
33a60 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
33a70 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
33a80 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
33a90 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
33aa0 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
33ab0 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
33ac0 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
33ad0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
33ae0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
33af0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
33b00 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
33b10 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
33b20 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
33b30 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
33b40 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
33b50 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
33b60 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
33b70 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
33b80 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
33b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33ba0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
33bb0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
33bc0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
33bd0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
33be0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
33bf0 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
33c00 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
33c10 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
33c20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
33c30 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
33c40 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
33c50 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
33c60 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
33c70 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
33c80 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
33c90 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
33ca0 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
33cb0 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
33cc0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
33cd0 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
33ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
33cf0 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
33d00 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
33d10 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
33d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
33d30 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
33d40 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
33d50 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
33d60 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
33d70 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
33d80 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
33d90 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
33da0 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
33db0 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
33dc0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
33dd0 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
33de0 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
33df0 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
33e00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
33e10 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
33e20 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
33e30 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
33e40 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
33e50 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
33e60 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
33e70 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
33e80 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
33e90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
33ea0 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
33eb0 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
33ec0 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
33ed0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
33ee0 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
33ef0 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
33f00 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
33f10 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
33f20 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
33f30 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
33f40 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
33f50 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
33f60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
33f70 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
33f80 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
33f90 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
33fa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33fb0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
33fc0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
33fd0 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
33fe0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
33ff0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
34000 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
34010 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34020 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
34030 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
34040 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
34050 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
34060 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
34070 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
34080 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
34090 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
340a0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
340b0 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
340c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
340d0 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
340e0 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
340f0 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
34100 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
34110 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
34120 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
34130 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
34140 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
34150 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
34160 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
34170 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
34180 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
34190 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
341a0 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
341b0 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
341c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
341d0 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
341e0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
341f0 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
34200 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
34210 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
34220 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
34230 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
34240 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
34250 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
34260 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
34270 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
34280 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
34290 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
342a0 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
342b0 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
342c0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
342d0 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
342e0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
342f0 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
34300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
34310 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
34320 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
34330 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
34340 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
34350 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
34360 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
34370 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
34380 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
34390 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
343a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
343b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
343c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
343d0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
343e0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
343f0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
34400 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
34410 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
34420 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34430 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
34440 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
34450 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
34460 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
34470 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
34480 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
34490 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
344a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
344b0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
344c0 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
344d0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
344e0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
344f0 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
34500 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
34510 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
34520 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
34530 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
34540 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
34550 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
34560 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
34570 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
34580 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
34590 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
345a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
345b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
345c0 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
345d0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
345e0 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
345f0 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
34600 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
34610 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
34620 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
34630 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
34640 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
34650 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
34660 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
34670 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
34680 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
34690 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
346a0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
346b0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
346c0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
346d0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
346e0 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
346f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
34700 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
34710 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
34720 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
34730 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
34740 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
34750 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
34760 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
34770 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
34780 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
34790 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
347a0 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
347b0 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
347c0 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
347d0 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
347e0 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
347f0 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
34800 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
34810 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
34820 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
34830 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
34840 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
34850 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
34860 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
34870 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
34880 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
34890 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
348a0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
348b0 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
348c0 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
348d0 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
348e0 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
348f0 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
34900 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
34910 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
34920 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
34930 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
34940 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
34950 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
34960 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
34970 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
34980 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64  ze("", off).#end
34990 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  if.static int ba
349a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
349b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
349c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
349d0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
349e0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
349f0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
34a00 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
34a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
34a30 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
34a40 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
34a50 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
34a60 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
34a70 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
34a80 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
34a90 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
34aa0 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
34ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34ac0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
34ad0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69  root-page */.  i
34ae0 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20  nt bBulk        
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34b00 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
34b10 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61  all is part of a
34b20 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b   bulk load */.){
34b30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34b50 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
34b60 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
34b70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
34b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34b90 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
34ba0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
34bb0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
34bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
34bd0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
34be0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
34bf0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
34c00 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
34c10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34c20 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
34c30 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
34c40 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
34c50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34c60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
34c70 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
34c80 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
34c90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
34ca0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
34cb0 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
34cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
34cd0 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
34ce0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
34cf0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
34d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
34d10 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
34d20 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
34d30 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
34d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
34d50 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
34d60 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
34d70 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34d90 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
34da0 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
34db0 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
34dc0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
34dd0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
34de0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
34df0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
34e00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
34e10 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
34e20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
34e30 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
34e40 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
34e50 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
34e60 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
34e70 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
34e80 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
34e90 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
34ea0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
34eb0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
34ec0 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
34ed0 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
34ee0 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
34ef0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
34f00 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
34f10 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
34f20 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
34f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34f40 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
34f50 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
34f60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
34f70 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
34f80 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
34f90 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
34fa0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
34fb0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
34fc0 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
34fd0 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
34fe0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
34ff0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
35000 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
35010 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
35020 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
35030 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
35040 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
35050 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
35060 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
35070 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
35080 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
35090 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
350a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
350b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
350c0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
350d0 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
350e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
350f0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
35100 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
35110 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
35120 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
35130 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
35140 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
35150 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
35160 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
35170 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
35180 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
35190 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
351a0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
351b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
351c0 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
351d0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
351e0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
351f0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
35200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
35210 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
35220 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
35230 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35250 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
35260 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
35270 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
35280 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
35290 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
352a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
352b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
352c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
352d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
352e0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
352f0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
35300 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
35310 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
35320 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
35330 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
35340 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
35350 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
35360 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
35370 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
35380 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
35390 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
353a0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
353b0 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
353c0 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
353d0 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
353e0 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
353f0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
35400 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
35410 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
35420 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
35430 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
35440 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
35450 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
35460 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
35470 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
35480 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
35490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
354a0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
354b0 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
354c0 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65  aiOvfl[0]==iPare
354d0 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
354e0 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
354f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35500 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
35510 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
35520 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
35530 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
35540 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
35550 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
35560 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
35570 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
35580 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
35590 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
355a0 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
355b0 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
355c0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
355d0 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
355e0 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
355f0 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
35600 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
35610 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
35620 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
35630 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
35640 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
35650 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
35660 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
35670 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
35680 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
35690 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
356a0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
356b0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
356c0 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
356d0 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
356e0 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
356f0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
35700 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
35710 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
35720 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
35730 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20   page, since if 
35740 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79  any existed they
35750 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20   will.  ** have 
35760 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d  already been rem
35770 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d  oved..  */.  i =
35780 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
35790 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
357a0 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
357b0 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
357c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
357d0 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
357e0 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20  || bBulk==1 );. 
357f0 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
35800 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
35810 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
35820 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
35830 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
35840 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
35850 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b  xDiv = i-2+bBulk
35860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35870 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b     assert( bBulk
35880 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44  ==0 );.      nxD
35890 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
358a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
358b0 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20   2-bBulk;.  }.  
358c0 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66  nOld = i+1;.  if
358d0 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
358e0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
358f0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
35900 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
35910 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
35920 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
35930 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
35940 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
35950 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
35960 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
35970 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
35980 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
35990 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
359a0 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
359b0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
359c0 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
359d0 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  d[i], 0);.    if
359e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
359f0 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
35a00 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
35a10 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
35a20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
35a30 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
35a40 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
35a50 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
35a60 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
35a70 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
35a80 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
35a90 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
35aa0 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
35ab0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
35ac0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
35ad0 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
35ae0 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  nt->apOvfl[0];. 
35af0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
35b00 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
35b10 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
35b20 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
35b30 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
35b40 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
35b50 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
35b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35b70 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
35b80 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
35b90 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
35ba0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
35bb0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
35bc0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
35bd0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
35be0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
35bf0 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
35c00 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
35c10 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
35c20 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
35c30 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
35c40 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
35c50 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
35c60 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
35c70 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
35c80 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
35c90 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
35ca0 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
35cb0 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
35cc0 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
35cd0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
35ce0 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
35cf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
35d00 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
35d10 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
35d20 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
35d30 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
35d40 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
35d50 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
35d60 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
35d70 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
35d80 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
35d90 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
35da0 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
35db0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
35dc0 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
35dd0 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
35de0 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
35df0 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
35e00 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
35e10 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
35e20 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
35e30 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
35e40 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
35e50 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
35e60 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
35e70 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
35e80 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
35e90 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
35ea0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
35eb0 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
35ec0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73      if( pBt->bts
35ed0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
35ee0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
35ef0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
35f00 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
35f10 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
35f20 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
35f30 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
35f40 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
35f50 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
35f60 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
35f70 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
35f80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
35f90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
35fa0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
35fb0 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
35fc0 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
35fd0 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
35fe0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
35ff0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
36000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36010 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
36020 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
36030 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
36040 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
36050 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
36060 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
36070 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
36080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36090 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
360a0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
360b0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
360c0 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
360d0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
360e0 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
360f0 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
36100 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
36110 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
36120 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
36130 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
36140 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
36150 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
36160 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
36170 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
36180 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
36190 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
361a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
361b0 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
361c0 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
361d0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
361e0 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
361f0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
36200 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
36210 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
36220 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
36230 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
36240 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
36250 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
36260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36270 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
36280 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
36290 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
362a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
362c0 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
362d0 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
362e0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
362f0 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
36300 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
36310 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
36320 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36330 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
36340 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
36350 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
36360 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
36370 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
36380 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
36390 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
363a0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
363b0 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
363c0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
363d0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
363e0 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
363f0 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
36400 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
36410 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
36420 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
36430 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
36440 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
36450 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
36460 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
36470 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
36480 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64  remove the divid
36490 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er cells.  ** fr
364a0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
364b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
364c0 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
364d0 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
364e0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
364f0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
36500 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
36510 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
36520 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
36530 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
36540 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
36550 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
36560 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36570 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
36580 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
36590 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
365a0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
365b0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
365c0 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
365d0 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
365e0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
365f0 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
36600 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
36610 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
36620 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
36630 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
36640 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
36650 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
36660 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
36670 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
36680 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
36690 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
366a0 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
366b0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
366c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
366d0 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
366e0 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
366f0 70 4f 6c 64 5b 30 5d 2d 3e 69 6e 74 4b 65 79 4c  pOld[0]->intKeyL
36700 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  eaf;.  for(i=0; 
36710 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
36720 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
36730 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
36740 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
36750 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
36760 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
36770 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
36780 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
36790 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
367a0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
367b0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
367c0 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
367d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
367e0 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
367f0 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
36800 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
36810 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
36820 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
36830 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
36840 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
36850 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
36860 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
36870 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
36880 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
36890 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
368a0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
368b0 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
368c0 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
368d0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
368e0 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
368f0 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
36900 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
36910 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
36920 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
36930 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
36940 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
36950 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
36960 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
36970 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
36980 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
36990 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
369a0 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
369b0 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
369c0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
369d0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
369e0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
369f0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
36a00 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
36a10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36a20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
36a30 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
36a40 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
36a50 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
36a60 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
36a70 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
36a80 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
36a90 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
36aa0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
36ab0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
36ac0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
36ad0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
36ae0 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
36af0 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
36b00 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
36b10 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
36b20 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
36b30 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
36b40 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
36b50 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
36b60 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
36b70 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
36b80 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
36b90 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
36ba0 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
36bb0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
36bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
36bd0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
36be0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
36bf0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
36c00 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
36c10 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
36c20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
36c30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
36c40 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
36c50 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
36c60 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
36c70 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
36c80 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
36c90 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
36ca0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
36cb0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
36cc0 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
36cd0 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
36ce0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
36cf0 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
36d00 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
36d10 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
36d20 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
36d30 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
36d40 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
36d50 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
36d60 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
36d70 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
36d80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36d90 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
36da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
36db0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
36dc0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
36dd0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
36de0 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
36df0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
36e00 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
36e10 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
36e20 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
36e30 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
36e40 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
36e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
36e60 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
36e70 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
36e80 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
36e90 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
36ea0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
36eb0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
36ec0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
36ed0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
36ee0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
36ef0 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
36f00 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
36f10 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
36f20 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
36f30 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
36f40 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
36f50 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
36f60 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
36f70 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
36f80 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
36f90 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
36fa0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
36fb0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
36fc0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
36fd0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
36fe0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
36ff0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
37000 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
37010 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
37020 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
37030 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
37040 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
37050 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
37060 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
37070 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
37080 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
37090 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
370a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
370b0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
370c0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
370d0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
370e0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
370f0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
37100 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
37110 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
37120 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
37130 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
37140 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
37150 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
37160 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
37170 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
37180 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
37190 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
371a0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
371b0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
371c0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
371d0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
371e0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
371f0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
37200 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
37210 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
37220 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
37230 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
37240 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
37250 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
37260 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
37270 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
37280 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
37290 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
372a0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
372b0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
372c0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
372d0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
372e0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
372f0 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
37300 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
37310 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37320 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
37330 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
37340 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
37350 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
37360 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
37370 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
37380 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
37390 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
373a0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
373b0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
373c0 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
373d0 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
373e0 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
373f0 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
37400 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
37410 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
37420 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
37430 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
37440 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
37450 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
37460 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
37470 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
37480 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
37490 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
374a0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
374b0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
374c0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
374d0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
374e0 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
374f0 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
37500 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
37510 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
37520 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
37530 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
37540 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
37550 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
37560 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
37570 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
37580 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
37590 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
375a0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
375b0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
375c0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
375d0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
375e0 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
375f0 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
37600 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
37610 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
37620 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
37630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37640 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
37650 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
37660 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
37670 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
37680 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
37690 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
376a0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
376b0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
376c0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
376d0 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
376e0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
376f0 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
37700 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
37710 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
37720 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
37730 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20  szRight==0 .    
37740 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26     || (!bBulk &&
37750 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
37760 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
37770 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20  Cell[r]+2)) .   
37780 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
37790 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
377a0 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
377b0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
377c0 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
377d0 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
377e0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
377f0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
37800 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
37810 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
37820 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
37830 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
37840 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
37850 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
37860 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
37870 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
37880 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
37890 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
378a0 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
378b0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
378c0 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
378d0 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
378e0 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
378f0 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
37900 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
37910 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20  **.  ** UPDATE: 
37920 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
37930 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  low is not neces
37940 73 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74  sarily true if t
37950 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
37960 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
37970 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f  .  The corruptio
37980 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74  n will be detect
37990 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ed and reported 
379a0 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68  later.  ** in th
379b0 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20  is procedure so 
379c0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
379d0 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20   to act upon it 
379e0 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  now..  */.#if 0.
379f0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
37a00 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
37a10 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
37a20 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
37a30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52   );.#endif..  TR
37a40 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
37a50 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
37a60 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
37a70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
37a80 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
37a90 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
37aa0 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
37ab0 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
37ac0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
37ad0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
37ae0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
37af0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
37b00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
37b10 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
37b20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
37b30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
37b40 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
37b50 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
37b60 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
37b70 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
37b80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
37b90 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
37ba0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
37bb0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
37bc0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
37bd0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
37be0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
37bf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37c00 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
37c10 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
37c20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
37c30 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
37c40 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
37c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37c60 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
37c70 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
37c80 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
37c90 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
37ca0 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e  (bBulk ? 1 : pgn
37cb0 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  o), 0);.      if
37cc0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
37cd0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
37ce0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
37cf0 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
37d00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
37d10 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
37d20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
37d30 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
37d40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
37d50 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
37d60 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
37d70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
37d80 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
37d90 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
37da0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37db0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37dc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
37dd0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
37de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37df0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
37e00 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
37e10 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
37e20 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
37e30 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
37e40 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
37e50 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
37e60 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
37e70 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
37e80 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
37e90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37ea0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
37eb0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
37ec0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
37ed0 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
37ee0 20 70 61 67 65 73 20 69 6e 20 61 73 63 65 6e 64   pages in ascend
37ef0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
37f00 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
37f10 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
37f20 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
37f30 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
37f40 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
37f50 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
37f60 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
37f70 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
37f80 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
37f90 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
37fa0 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
37fb0 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
37fc0 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
37fd0 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
37fe0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
37ff0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
38000 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
38010 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
38020 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
38030 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
38040 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
38050 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
38060 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
38070 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
38080 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
38090 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
380a0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
380b0 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
380c0 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
380d0 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
380e0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
380f0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
38100 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
38110 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
38120 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
38130 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
38140 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
38150 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
38160 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
38170 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
38180 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
38190 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
381a0 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
381b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
381c0 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
381d0 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
381e0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
381f0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
38200 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
38210 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
38220 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
38230 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
38240 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
38250 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
38260 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
38270 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
38280 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
38290 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
382a0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
382b0 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
382c0 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
382d0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
382e0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
382f0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
38300 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
38310 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
38320 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
38330 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
38340 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
38350 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
38360 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
38370 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
38380 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
38390 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
383a0 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
383b0 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
383c0 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
383d0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
383e0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
383f0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
38400 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
38410 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
38420 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
38430 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
38440 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
38450 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
38460 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
38470 69 2b 2b 29 7b 0a 20