/ Hex Artifact Content
Login

Artifact eeebb8175df346b720bc68f7fbb528d5fcfdccfd:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62 20  ){.        iTab 
1920: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1930: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1940: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1950: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1970: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1980: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
1990: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19a0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19b0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19c0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19d0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19e0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
19f0: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a00: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a10: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a20: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a30: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a40: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a70: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1a90: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1aa0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ab0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ac0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ad0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1ae0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1af0: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b00: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b30: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b40: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b70: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1b90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1ba0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bb0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bc0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1bd0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1be0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1bf0: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c00: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c10: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c20: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c40: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c50: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c70: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c80: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1c90: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1ca0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cb0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cc0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1cd0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1ce0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1cf0: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d00: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d20: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d30: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d40: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d50: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d60: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d70: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d80: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1d90: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1da0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1db0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dc0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1de0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1df0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e00: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e10: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e20: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e30: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e40: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e50: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e60: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e70: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e80: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1e90: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1ea0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1eb0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ec0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ed0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ee0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1ef0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f00: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f10: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f20: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f40: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f50: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f80: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1f90: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fa0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fb0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fc0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fd0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1fe0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
1ff0: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2000: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2010: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2020: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2030: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2040: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2050: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2060: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2070: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2080: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
2090: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20b0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20c0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20d0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20e0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
20f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2100: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2110: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2130: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2140: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2150: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2160: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2170: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2180: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2190: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21a0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21b0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21c0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21d0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21e0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
21f0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2200: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2210: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2220: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2230: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2240: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2250: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2260: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2270: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2280: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2290: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22a0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22b0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22c0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22d0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22e0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22f0: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2300: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2310: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2330: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2350: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2360: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2370: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2380: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23b0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23d0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23e0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
23f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2400: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2410: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2420: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2430: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2440: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2450: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2460: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2470: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2480: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
2490: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24b0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24c0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24d0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24e0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
24f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2500: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2510: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2520: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2530: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2540: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2550: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2570: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2580: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2590: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25b0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25c0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25d0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25e0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2600: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2610: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2620: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2630: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2640: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2650: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2670: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2680: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2690: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26c0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26d0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2700: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2710: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2720: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2730: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2740: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2750: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2760: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2770: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2780: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2790: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27a0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27b0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2800: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2880: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2890: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28a0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28c0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28d0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28e0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
28f0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2900: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2910: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2920: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2930: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2940: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2950: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2960: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2970: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2980: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
2990: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29b0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29c0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29d0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29e0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
29f0: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a00: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a10: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a20: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a50: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a60: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a70: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a80: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ab0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ad0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ae0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2af0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b00: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b10: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b20: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b30: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b50: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b60: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b70: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b90: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2ba0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bb0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bc0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2bd0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2be0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2bf0: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c10: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c20: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c30: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c40: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c50: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c60: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c70: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c80: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2c90: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cb0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cc0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2ce0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cf0: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d00: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d10: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d20: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d30: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d40: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d50: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d80: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2d90: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2da0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2db0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dc0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2dd0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2de0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2df0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e10: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e20: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e30: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e40: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e50: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e60: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e70: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2e90: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2ea0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2eb0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ec0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ed0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ee0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2ef0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f00: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f20: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f30: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f40: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f50: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f60: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f70: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f80: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2f90: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fa0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fb0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fc0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fd0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2fe0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
2ff0: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3000: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3020: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3030: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3040: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3050: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3060: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3070: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
3090: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30a0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30b0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
30f0: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3100: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3110: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3120: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3130: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3140: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3150: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3160: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3170: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3180: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
3190: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31a0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31c0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31e0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31f0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3200: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3220: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3230: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3240: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3250: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3260: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3270: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3280: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
3290: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32a0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32b0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32c0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32d0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32e0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
32f0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3300: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3310: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3320: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3330: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3340: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3370: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3380: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3390: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33b0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33c0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33d0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33e0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
33f0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3400: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3420: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3430: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3440: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3450: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3460: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3470: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3480: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
3490: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34c0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34d0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34e0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
34f0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3500: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3510: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3530: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3540: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3550: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3560: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3580: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35a0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35b0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35d0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35e0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
35f0: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3600: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3610: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3620: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3630: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3640: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3650: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3660: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3670: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3680: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3690: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36b0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36c0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
36f0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3700: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3710: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3720: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3730: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3740: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3750: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3760: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3770: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3780: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3790: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37a0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37b0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37c0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37e0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
37f0: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3800: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3810: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3820: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3830: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3840: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3860: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3870: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3890: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38a0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38b0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38e0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
38f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3900: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3920: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3930: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3940: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3950: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3970: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3980: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3990: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39a0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39b0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39c0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39e0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
39f0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a00: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a10: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a20: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a30: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a50: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a60: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a70: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a80: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3a90: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3aa0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ab0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ad0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3ae0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3af0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b00: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b10: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bb0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bc0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3be0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bf0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c00: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c10: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c20: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c30: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c40: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c50: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c60: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c70: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c80: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3c90: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3ca0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cb0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3cd0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3ce0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3cf0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d00: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d30: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d40: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d50: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d60: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d70: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3db0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dc0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3dd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3de0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3df0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e00: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e10: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e20: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e30: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e40: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e50: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e60: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e80: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3e90: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3ea0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3eb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ed0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ee0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3ef0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f00: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f10: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f30: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f40: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f50: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f60: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f70: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f80: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3f90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fa0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fb0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fc0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fd0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ff0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4000: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4010: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4040: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4050: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4060: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4070: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4080: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4090: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40b0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40d0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
40f0: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4110: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4120: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4130: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4140: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4150: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4160: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4170: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4180: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
4190: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41a0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41b0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41e0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41f0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4200: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4210: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4220: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4230: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4250: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4260: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4270: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4280: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4290: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42a0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42b0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42c0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42d0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42e0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4300: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4310: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4320: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4330: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4340: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4350: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4360: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4370: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4380: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4390: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43a0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43b0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43c0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43e0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43f0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4400: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4410: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4430: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4440: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4450: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4460: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4470: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4480: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4490: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44a0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44b0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44c0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44d0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44f0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4500: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4510: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4520: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4530: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4540: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4560: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4570: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4580: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4590: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45b0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45c0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45d0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45e0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45f0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4600: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4610: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4620: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4630: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4640: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4650: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4660: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4670: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4680: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4690: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46a0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46b0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46c0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46d0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46e0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46f0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4700: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4710: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4720: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4730: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4740: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4750: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4760: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4770: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4780: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4790: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47a0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47d0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47e0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4800: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4810: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4820: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4830: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4840: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4850: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4860: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4870: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4890: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48b0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48c0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48d0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48e0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48f0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4900: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4910: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4920: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4930: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4960: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4980: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49c0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49d0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a00: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a60: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a80: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a90: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4aa0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ab0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ac0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ae0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4af0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b00: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b40: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b60: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b70: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b80: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b90: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4ba0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bb0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bc0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bd0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4be0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4bf0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c00: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c20: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c30: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c40: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c50: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c60: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c70: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c80: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4ca0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cb0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cc0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cd0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4ce0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4cf0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d20: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d30: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d40: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d50: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d70: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d80: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4da0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4db0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dd0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4de0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4df0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e10: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e30: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e40: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e50: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e60: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e70: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e90: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4ea0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4eb0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ec0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ed0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ee0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ef0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f00: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f10: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f20: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f30: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f40: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f60: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f70: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fa0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fc0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fd0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fe0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4ff0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5000: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5010: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5020: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5030: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5040: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5050: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5070: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5080: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50a0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50b0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50c0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50d0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50e0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50f0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5110: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5120: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5130: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5140: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5150: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5160: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5180: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5190: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51a0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51b0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51c0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51d0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51e0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5200: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5210: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5230: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5240: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5250: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5270: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5280: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52b0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
52f0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5300: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5310: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5320: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5340: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5350: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5360: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5370: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5380: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5390: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53a0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53d0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53e0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
53f0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5400: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5410: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5420: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5430: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5440: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5450: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5460: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5470: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5480: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
5490: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54a0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54b0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54c0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54d0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54e0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
54f0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5510: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5520: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5530: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5550: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5560: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5570: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5580: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
5590: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55a0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55b0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55c0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55d0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
55f0: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5600: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5610: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5620: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5630: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5640: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5650: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5660: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5670: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5680: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56a0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56c0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56d0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56e0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
56f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5700: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5710: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5720: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5730: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5740: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5750: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5760: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5770: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5780: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5790: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57b0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57c0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57d0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5800: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5810: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5820: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5830: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5840: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5850: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5860: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5870: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5880: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5890: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
58f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5900: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5910: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5920: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5930: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5940: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5950: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5960: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5970: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5980: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5990: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
59f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a70: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a80: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5a90: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ab0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5af0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b00: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b10: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b20: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b50: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5b90: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bb0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5bd0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5be0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c50: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c60: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c70: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c80: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5c90: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5ca0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cb0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cc0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5cd0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5ce0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5cf0: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d00: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d10: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d20: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d30: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d40: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d50: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d60: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d70: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d80: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5d90: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5da0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5db0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dc0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5dd0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5de0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e10: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e20: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e30: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e50: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5e90: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5ea0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5eb0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ec0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ed0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5ef0: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f00: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f10: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f20: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f30: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f40: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f50: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f60: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f70: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f80: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5f90: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fa0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fb0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fc0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fd0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5ff0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6000: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6010: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6020: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6030: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6040: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6050: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6060: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6070: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6080: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
6090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60c0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60e0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
60f0: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6100: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6110: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6130: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6140: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6170: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6180: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
6190: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61a0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61b0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61d0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61e0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
61f0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6200: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6210: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6220: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6230: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6240: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6250: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6270: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6280: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62b0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62c0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
62f0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6300: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6310: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6320: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6330: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6340: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6350: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6360: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6370: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6380: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6390: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63a0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63b0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63d0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
63f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6400: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6410: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6420: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6430: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6440: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6450: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6460: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6480: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6490: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64b0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64c0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
64f0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6500: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6510: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6520: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6530: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6540: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6550: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6570: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6580: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6590: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65a0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65b0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65c0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65d0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
65f0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6600: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6610: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6620: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6630: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6640: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6650: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6660: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6670: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6680: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6690: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66b0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66c0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66d0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66e0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
66f0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6700: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6710: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6720: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6730: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6740: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6750: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6760: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6780: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6790: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67b0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
67c0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
67d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
67e0: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
67f0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6800: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6810: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6820: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6830: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6840: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6850: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6860: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
6870: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
6880: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
6890: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
68a0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
68b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
68c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
68d0: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
68e0: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
68f0: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6900: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6910: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6920: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6930: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6940: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6950: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6960: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
6970: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
6980: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
6990: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
69a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
69b0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
69c0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
69d0: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
69e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
69f0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6a10: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6a20: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6a30: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6a40: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6a50: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6a60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6a70: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6a80: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
6a90: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6aa0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6ab0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6ac0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6ad0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6ae0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6af0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6b00: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6b10: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6b20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6b30: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6b50: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6b60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b90: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6ba0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6bb0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6bc0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6bd0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6be0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6bf0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6c00: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6c10: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6c20: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6c30: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6c40: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6c50: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6c60: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6c70: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6c80: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6c90: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6ca0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6cb0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6cc0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6cd0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6ce0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6cf0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6d00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6d10: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6d40: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6d50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d60: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6d70: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6d80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6d90: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6da0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6db0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6dc0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6de0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6df0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6e00: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6e10: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6e20: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6e30: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6e40: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6e50: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6e60: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6e70: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e80: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6e90: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6ea0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6eb0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6ec0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6ed0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6ee0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6ef0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6f00: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6f10: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6f20: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6f30: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6f40: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6f50: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6f60: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6f70: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6f80: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6f90: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6fa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6fb0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6fd0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6fe0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6ff0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7000: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7010: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7020: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7040: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7050: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7060: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7070: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7080: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7090: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
70a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
70b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
70c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
70d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
70e0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
70f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7100: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7110: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7120: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7130: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7140: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7150: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7160: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7170: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7180: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7190: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
71a0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
71b0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
71c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
71d0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
71e0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
71f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7200: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7220: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7230: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7240: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7250: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7260: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7270: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7280: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7290: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
72a0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
72b0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
72c0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
72d0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
72e0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
72f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7300: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7310: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7320: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7330: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7340: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7350: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7360: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7370: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7380: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7390: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
73a0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
73b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73c0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
73d0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
73e0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
73f0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7400: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7410: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7430: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7450: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7460: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7470: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7480: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7490: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
74a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
74b0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
74c0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
74d0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
74e0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
74f0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7500: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7510: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7520: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7530: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7540: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7550: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7560: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7570: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7580: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7590: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
75a0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
75b0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
75c0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
75d0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
75e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
75f0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7600: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7610: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7620: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7630: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7640: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7650: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7660: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7670: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7680: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
7690: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
76a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
76b0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
76c0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
76d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
76e0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
76f0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7710: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7720: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7730: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7740: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7750: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7760: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7770: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7780: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
7790: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
77a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
77b0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
77c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
77d0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
77e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
77f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7800: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7810: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7820: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7830: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7850: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7880: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7890: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
78a0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
78b0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
78c0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
78d0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
78e0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
78f0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7900: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7910: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7920: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7930: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7940: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7950: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7960: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
7970: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
7980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7990: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
79a0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
79b0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
79c0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
79d0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
79e0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
79f0: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7a00: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7a10: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7a20: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7a30: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7a40: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7a50: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7a60: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
7a70: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
7a80: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
7a90: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7aa0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
7ab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ac0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ad0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7ae0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7af0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7b00: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7b10: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7b20: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7b30: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7b40: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7b50: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7b60: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7b70: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7b80: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7b90: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7ba0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7bb0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7bc0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7bd0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7be0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7bf0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7c00: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7c10: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7c20: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7c30: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7c40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7c60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7c80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7c90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7ca0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7cb0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7cc0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7ce0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7cf0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7d00: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7d10: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7d30: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7d40: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7d50: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7d60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7d70: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7d80: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7d90: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7da0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7db0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7dc0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7dd0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7de0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7df0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e00: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7e10: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7e20: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7e30: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7e40: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7e50: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7e70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7e80: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7e90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7ea0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7eb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7ec0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7ed0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7ee0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7ef0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7f00: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7f10: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7f20: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7f30: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7f40: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7f50: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7f60: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7f70: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f90: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7fa0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7fe0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7ff0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
8000: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
8010: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8020: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
8030: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8040: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
8050: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
8060: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
8070: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8080: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
8090: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
80a0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
80b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
80c0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
80d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
80f0: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8100: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8110: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8120: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8130: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8140: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8150: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8160: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
8170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8180: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
8190: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
81a0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
81b0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
81c0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
81d0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
81e0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
81f0: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8200: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8210: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8220: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8230: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8240: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8250: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8260: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8270: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8280: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8290: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
82a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
82b0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
82c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
82d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82e0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
82f0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8300: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8310: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8320: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8330: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8340: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8350: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8360: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
8370: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
8380: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
8390: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
83a0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
83b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
83c0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
83d0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
83e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
83f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8400: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8410: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8420: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8430: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8440: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8450: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8460: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8470: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8480: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
8490: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
84a0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
84b0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
84c0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
84d0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
84e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
84f0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8500: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8510: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8520: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8530: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8540: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8550: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8560: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8570: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8580: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
8590: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
85a0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
85b0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
85c0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
85d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
85e0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
85f0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8600: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8610: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8620: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8630: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8640: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8650: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8660: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8670: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8680: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8690: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
86a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
86b0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
86c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
86d0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
86e0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
86f0: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8700: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8720: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8730: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8740: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8750: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8760: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
8770: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8780: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8790: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
87a0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
87b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87c0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
87d0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
87e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
87f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8800: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8810: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8820: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8830: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8840: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8850: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8860: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8870: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8880: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8890: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
88a0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
88b0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88d0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
88e0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
88f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8900: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8910: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8920: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8930: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8940: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8950: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8960: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
8970: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
8980: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8990: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
89a0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
89b0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
89c0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
89d0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
89e0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
89f0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8a00: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8a10: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8a20: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8a30: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8a40: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8a50: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8a60: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a70: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
8a80: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8a90: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
8aa0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
8ab0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
8ac0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8ad0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8ae0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8b20: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8b30: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8b60: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8b70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8b80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8b90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8ba0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8bb0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8bc0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8bd0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8be0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8bf0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8c00: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8c10: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8c20: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8c30: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8c40: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8c50: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8c60: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8c70: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8c80: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8c90: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8ca0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8cb0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8cc0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8cd0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8ce0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8cf0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8d00: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8d10: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8d20: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8d30: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d50: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8d60: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8d70: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8d80: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8d90: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8da0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8db0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8dc0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8dd0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8de0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8df0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8e00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8e10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8e20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8e30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8e50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8e60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8e70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8e80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8e90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8ea0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8eb0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8ed0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8ee0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8ef0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8f00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8f10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8f20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8f30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8f40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8f50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8f70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8f80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8f90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8fa0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8fb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8fc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8fd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8fe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8ff0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9000: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9010: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9020: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9030: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9040: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9050: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9060: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9070: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9080: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9090: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90b0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
90c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
90e0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
90f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9100: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9110: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9120: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9130: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9140: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9150: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9160: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
9170: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
9180: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
9190: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
91a0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
91b0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
91c0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
91d0: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
91e0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
91f0: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9200: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9210: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9220: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9230: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9240: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9250: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9260: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9280: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
9290: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
92a0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
92b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
92c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
92d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
92e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
92f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9300: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9310: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9330: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9340: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9350: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9360: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
9370: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
9380: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
9390: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
93a0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
93b0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
93c0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
93d0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
93e0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
93f0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9400: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9410: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9420: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9430: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9440: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9450: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9460: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9470: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9480: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
9490: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
94a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
94b0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
94c0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
94d0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
94e0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
94f0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9500: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9510: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9520: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9530: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9540: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
9550: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
9560: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
9570: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
95a0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
95b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
95d0: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
95e0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
9610: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
9620: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9640: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
9650: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
9660: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
9680: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
9690: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
96a0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
96b0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
96c0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
96d0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
96e0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
96f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9700: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
9710: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9720: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
9730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9740: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
9750: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
9760: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9770: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
9780: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
9790: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
97a0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
97b0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
97c0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
97d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
97e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
97f0: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
9800: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
9810: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
9820: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
9830: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
9840: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
9850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9860: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
9870: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61  l index */...  a
9880: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9890: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
98a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
98b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
98c0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
98d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
98e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
98f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
9900: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
9910: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
9920: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
9930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9940: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9950: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
9960: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
9970: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
9980: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
9990: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
99a0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
99b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
99c0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
99d0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
99e0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
99f0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
9a00: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
9a10: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
9a20: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
9a30: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
9a40: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
9a50: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
9a60: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
9a70: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
9a80: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
9a90: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
9aa0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
9ab0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
9ac0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
9ad0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
9ae0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
9af0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
9b00: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
9b10: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
9b20: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
9b30: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
9b40: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
9b50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9b60: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9b70: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
9b80: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
9b90: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
9ba0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
9bb0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
9bc0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
9bd0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9be0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
9bf0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
9c00: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
9c10: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
9c20: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
9c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9c40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
9c50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
9c60: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
9c70: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
9c80: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
9c90: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
9ca0: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
9cb0: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9cc0: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9cd0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9ce0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9cf0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9d00: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
9d10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9d20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9d30: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
9d40: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9d50: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9d60: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d90: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9da0: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9db0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9dc0: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9dd0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9de0: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
9df0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
9e00: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
9e10: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9e20: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
9e30: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
9e40: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
9e50: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
9e60: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
9e70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
9e80: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
9e90: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
9ea0: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
9eb0: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
9ec0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
9ed0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9ee0: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
9ef0: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
9f00: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
9f10: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
9f20: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
9f30: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
9f40: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  size);.  }.  ass
9f50: 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  ert( cbrk>=iCell
9f60: 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62  First );.  put2b
9f70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
9f80: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
9f90: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
9fa0: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
9fb0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
9fc0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
9fd0: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
9fe0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
9ff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a000: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a010: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a020: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
a030: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
a040: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
a050: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a060: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a070: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
a080: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a090: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
a0a0: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
a0b0: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
a0c0: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
a0d0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
a0e0: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
a0f0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
a100: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a110: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
a120: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
a130: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
a140: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
a150: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
a160: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
a170: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
a180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
a190: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
a1a0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
a1b0: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
a1c0: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
a1d0: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
a1e0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
a1f0: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
a200: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
a210: 2a 0a 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f  *.** If a slot o
a220: 66 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  f at least nByte
a230: 20 62 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20   bytes is found 
a240: 62 75 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  but cannot be us
a250: 65 64 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  ed because .** t
a260: 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
a270: 20 61 74 20 6c 65 61 73 74 20 36 30 20 66 72 61   at least 60 fra
a280: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
a290: 20 74 68 65 20 70 61 67 65 2c 20 72 65 74 75 72   the page, retur
a2a0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68  n NULL..** In th
a2b0: 69 73 20 63 61 73 65 2c 20 69 66 20 70 62 44 65  is case, if pbDe
a2c0: 66 72 61 67 20 70 61 72 61 6d 65 74 65 72 20 69  frag parameter i
a2d0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20  s not NULL, set 
a2e0: 2a 70 62 44 65 66 72 61 67 20 74 6f 20 74 72 75  *pbDefrag to tru
a2f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  e..*/.static u8 
a300: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
a310: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
a320: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c  nByte, int *pRc,
a330: 20 69 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b   int *pbDefrag){
a340: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
a350: 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
a360: 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  t;.  u8 * const 
a370: 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
a380: 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b  ta;.  int iAddr;
a390: 0a 20 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74  .  int pc;.  int
a3a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
a3b0: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
a3c0: 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72  ze;..  for(iAddr
a3d0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
a3e0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41  t2byte(&aData[iA
a3f0: 64 64 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d  ddr]))>0; iAddr=
a400: 70 63 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a  pc){.    int siz
a410: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a420: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a430: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 69 66  e slot */.    if
a440: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
a450: 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20  4 || pc<iAddr+4 
a460: 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  ){.      *pRc = 
a470: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a480: 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
a490: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 0;.    }.    s
a4a0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
a4b0: 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  aData[pc+2]);.  
a4c0: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
a4d0: 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  e ){.      int x
a4e0: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
a4f0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a500: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
a510: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
a520: 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29  .      if( x<4 )
a530: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  {.        if( aD
a540: 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29  ata[hdr+7]>=60 )
a550: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a560: 70 62 44 65 66 72 61 67 20 29 20 2a 70 62 44 65  pbDefrag ) *pbDe
a570: 66 72 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  frag = 1;.      
a580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a5a0: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
a5b0: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
a5c0: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
a5d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
a5e0: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
a5f0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
a600: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
a610: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
a620: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
a630: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
a640: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
a650: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
a660: 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63  else if( size+pc
a670: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
a680: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
a690: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a6a0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  KPT;.        ret
a6b0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
a6c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
a6d0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
a6e0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
a6f0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
a700: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
a710: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
a720: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
a730: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
a740: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
a750: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
a760: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
a770: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
a780: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
a790: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
a7a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
a7b0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
a7c0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
a7d0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
a7e0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
a7f0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
a800: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
a810: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
a820: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
a830: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
a840: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
a850: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
a860: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
a870: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
a880: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
a890: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
a8a0: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
a8b0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
a8c0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
a8d0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
a8e0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
a8f0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
a900: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
a910: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
a920: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
a930: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
a940: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
a950: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
a960: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
a970: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
a980: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
a990: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
a9a0: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
a9b0: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
a9c0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
a9d0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
a9e0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
a9f0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
aa00: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
aa10: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
aa20: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
aa30: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
aa40: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
aa50: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
aa60: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
aa70: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
aa80: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
aa90: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
aaa0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
aab0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
aac0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
aad0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
aae0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
aaf0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
ab00: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
ab10: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ab40: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
ab50: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
ab60: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
ab70: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
ab80: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
ab90: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
aba0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
abb0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
abc0: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
abd0: 6f 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ode */.  .  asse
abe0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
abf0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ac00: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ac10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac20: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
ac30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ac40: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ac50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
ac60: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
ac70: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
ac80: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
ac90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
aca0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
acb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
acc0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
acd0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
ace0: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
acf0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
ad00: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
ad10: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
ad20: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
ad30: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
ad40: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
ad50: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
ad60: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
ad70: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
ad80: 36 20 29 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  6 );.  top = get
ad90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ada0: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
adb0: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
adc0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 6f  p==0 ){.      to
add0: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
ade0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
adf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ae00: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
ae10: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
ae20: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
ae30: 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64   between gap and
ae40: 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72   top for one mor
ae50: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20  e cell pointer. 
ae60: 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20   ** array entry 
ae70: 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74  offset, and if t
ae80: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e  he freelist is n
ae90: 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73  ot empty, then s
aea0: 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66  earch the.  ** f
aeb0: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
aec0: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
aed0: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
aee0: 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73  tisfy the reques
aef0: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
af00: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
af10: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
af20: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
af30: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
af40: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c   );.  if( gap+2<
af50: 3d 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64  =top && (data[hd
af60: 72 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72  r+1] || data[hdr
af70: 2b 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  +2]) ){.    int 
af80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
af90: 20 20 20 20 69 6e 74 20 62 44 65 66 72 61 67 20      int bDefrag 
afa0: 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70  = 0;.    u8 *pSp
afb0: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
afc0: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
afd0: 20 26 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b   &rc, &bDefrag);
afe0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
aff0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
b000: 20 62 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20   bDefrag ) goto 
b010: 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b  defragment_page;
b020: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
b030: 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
b040: 20 70 53 70 61 63 65 20 2d 20 64 61 74 61 3b 0a   pSpace - data;.
b050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b060: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
b070: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
b080: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
b090: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
b0a0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
b0b0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
b0c0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
b0d0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
b0e0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
b0f0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
b100: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
b110: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
b120: 20 29 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f   ){. defragment_
b130: 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74 63 61  page:.    testca
b140: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
b150: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
b160: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
b170: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
b180: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b190: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b1a0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
b1b0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
b1c0: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
b1d0: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
b1e0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
b1f0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
b200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
b210: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
b220: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
b230: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
b240: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
b250: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
b260: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
b270: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
b280: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
b290: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
b2a0: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
b2b0: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
b2c0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
b2d0: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
b2e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
b2f0: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
b300: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
b310: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
b320: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
b330: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
b340: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b350: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
b360: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
b370: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
b380: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b390: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
b3a0: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
b3b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b3c0: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
b3d0: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
b3e0: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
b3f0: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
b400: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b410: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
b420: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
b430: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
b440: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
b450: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
b460: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
b470: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
b480: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
b490: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
b4a0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
b4b0: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
b4c0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
b4d0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
b4e0: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
b4f0: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
b500: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
b510: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
b520: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
b530: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
b540: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
b550: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
b560: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
b570: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
b580: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
b590: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
b5a0: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
b5b0: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
b5c0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
b5d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b5e0: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
b5f0: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
b600: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
b610: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
b620: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
b630: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
b640: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b670: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
b680: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
b690: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b6c0: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
b6d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
b6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
b710: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
b720: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
b730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
b750: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
b760: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
b770: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
b780: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
b790: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
b7a0: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
b7b0: 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70  .  u32 iLast = p
b7c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b7d0: 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67  eSize-4; /* Larg
b7e0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
b7f0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b800: 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53  .  u32 iEnd = iS
b810: 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20  tart + iSize;   
b820: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b830: 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
b840: 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f  iStart buffer */
b850: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b860: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
b870: 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65  aData;   /* Page
b880: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61   content */..  a
b890: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b8a0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b8b0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b8c0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b8d0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b8e0: 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70  ssert( iStart>=p
b8f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
b900: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
b910: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
b920: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
b930: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
b940: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b960: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b970: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b980: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
b990: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
b9a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
b9b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
b9c0: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
b9d0: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
b9e0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
b9f0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
ba00: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
ba10: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
ba20: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
ba30: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
ba40: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
ba50: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
ba60: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
ba70: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
ba80: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
ba90: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
baa0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
bab0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
bac0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
bad0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
bae0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
baf0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
bb00: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
bb10: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
bb20: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
bb30: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
bb40: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
bb50: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
bb60: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
bb70: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
bb80: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
bb90: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
bba0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
bbb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
bbc0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
bbd0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bbe0: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
bbf0: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
bc00: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
bc10: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
bc20: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bc30: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
bc40: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
bc50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
bc60: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
bc70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bc80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
bc90: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
bca0: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
bcb0: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
bcc0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
bcd0: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
bce0: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
bcf0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
bd00: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
bd10: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
bd20: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
bd30: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
bd40: 72 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  r iFreeBlk.    *
bd50: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
bd60: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
bd70: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
bd80: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
bd90: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
bda0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
bdb0: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
bdc0: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
bdd0: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
bde0: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
bdf0: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
be00: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
be10: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be20: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69  ;.      iEnd = i
be30: 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79  FreeBlk + get2by
be40: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
be50: 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69  k+2]);.      iSi
be60: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
be70: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
be80: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
be90: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
bea0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
beb0: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
bec0: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
bed0: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
bee0: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
bef0: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
bf00: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
bf10: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
bf20: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
bf30: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
bf40: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
bf50: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
bf60: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
bf70: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
bf80: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
bf90: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
bfa0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
bfb0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
bfc0: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
bfd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
bfe0: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c000: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c010: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
c020: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
c030: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
c040: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
c050: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
c060: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
c070: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
c080: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
c090: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
c0b0: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
c0c0: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
c0d0: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
c0e0: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
c0f0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
c100: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
c110: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
c120: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
c130: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
c140: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
c150: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
c160: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
c170: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
c180: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
c190: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
c1a0: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
c1b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c1c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
c1d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
c1e0: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
c1f0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c200: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
c210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
c220: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
c230: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
c240: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
c250: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c260: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
c270: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
c280: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
c290: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
c2a0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c2b0: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
c2c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
c2d0: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
c2e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c2f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
c300: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
c310: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
c320: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
c330: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
c340: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
c350: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
c360: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
c370: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
c380: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
c390: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
c3a0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
c3b0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
c3c0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
c3d0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
c3e0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
c3f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
c400: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
c410: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
c420: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
c430: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
c440: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
c450: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
c460: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
c470: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
c490: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
c4a0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c4b0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
c4c0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
c4d0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
c4e0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
c4f0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
c500: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
c510: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
c520: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c530: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c540: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c550: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
c560: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
c570: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
c580: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
c590: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
c5a0: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
c5b0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
c5c0: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
c5d0: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
c5e0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
c5f0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
c600: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
c610: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
c620: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
c630: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c640: 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e  eyLeaf = pPage->
c650: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
c660: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50  >noPayload = !pP
c670: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
c680: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
c690: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
c6a0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
c6b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
c6c0: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
c6d0: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
c6e0: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61  ODATA ){.    pPa
c6f0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a  ge->intKey = 0;.
c700: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
c710: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70  yLeaf = 0;.    p
c720: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
c730: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
c740: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
c750: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
c760: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
c770: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
c780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
c790: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c7a0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  T_BKPT;.  }.  pP
c7b0: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
c7c0: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
c7d0: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
c7e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c7f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c800: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
c810: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
c820: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
c830: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
c840: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
c850: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
c860: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
c870: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
c880: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
c890: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
c8a0: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
c8b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
c8c0: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
c8d0: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
c8e0: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
c8f0: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
c900: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
c910: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
c920: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
c930: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
c940: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
c950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c960: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
c970: 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73  e *pPage){..  as
c980: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c990: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c9a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c9b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c9c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
c9d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
c9e0: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
c9f0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
ca00: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
ca10: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
ca20: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
ca30: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ca40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
ca50: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
ca60: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
ca70: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
ca80: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
ca90: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
caa0: 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20      u16 pc;     
cab0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
cac0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
cad0: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
cae0: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
caf0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
cb00: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
cb10: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
cb20: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
cb30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
cb40: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
cb50: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
cb60: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
cb70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
cb80: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
cb90: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
cba0: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
cbb0: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
cbc0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
cbd0: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
cbe0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
cbf0: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
cc00: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
cc10: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
cc20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
cc30: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
cc40: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
cc50: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
cc60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
cc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
cc80: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
cc90: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cca0: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
ccb0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
ccc0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
ccd0: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
cce0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
ccf0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
cd00: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
cd10: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
cd20: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
cd30: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
cd40: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
cd50: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
cd60: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
cd70: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
cd80: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
cd90: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
cda0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
cdb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
cdc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
cdd0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
cde0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
cdf0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
ce00: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
ce10: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
ce20: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
ce30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ce40: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
ce50: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
ce60: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ce70: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
ce80: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
ce90: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
cea0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
ceb0: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
cec0: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
ced0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
cee0: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
cef0: 66 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d  fset];.    top =
cf00: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
cf10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
cf20: 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
cf30: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cf40: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69  a[hdr+3]);.    i
cf50: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
cf60: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
cf70: 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79        /* To many
cf80: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
cf90: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
cfa0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
cfb0: 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  upt */.      ret
cfc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cfd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
cfe0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
cff0: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45  ge->nCell==MX_CE
d000: 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20  LL(pBt) );..    
d010: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
d020: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
d030: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
d040: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
d050: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
d060: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
d070: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
d080: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
d090: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
d0a0: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
d0b0: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
d0c0: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
d0d0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
d0e0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
d0f0: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
d100: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
d110: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
d120: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
d130: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
d140: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
d150: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
d160: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
d170: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
d180: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
d190: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
d1a0: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
d1b0: 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69     {.      int i
d1c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d1d0: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
d1e0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
d1f0: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
d200: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
d210: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
d220: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
d230: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
d240: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
d250: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
d260: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
d270: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
d280: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
d290: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
d2a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d2b0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
d2c0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
d2d0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
d2e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d2f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
d300: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
d310: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d320: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d330: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
d340: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
d350: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
d360: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
d370: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
d380: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
d390: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
d3a0: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
d3b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
d3c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d3d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
d3e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d3f0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
d400: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
d410: 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a  .    }  .#endif.
d420: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
d430: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
d440: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
d450: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
d460: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d470: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
d480: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
d490: 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  op;.    while( p
d4a0: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
d4b0: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
d4c0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
d4d0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
d4e0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
d4f0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65  /* Start of free
d500: 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68   block is off th
d510: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  e page */.      
d520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d530: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
d540: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
d550: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
d560: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
d570: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
d580: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
d590: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
d5a0: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
d5b0: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
d5c0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
d5d0: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
d5e0: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
d5f0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
d600: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
d610: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
d620: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
d630: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
d640: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
d650: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
d660: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d670: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
d680: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
d690: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
d6a0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
d6b0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
d6c0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
d6d0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
d6e0: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
d6f0: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
d700: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
d710: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
d720: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
d730: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
d740: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
d750: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
d760: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
d770: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
d780: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
d790: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
d7a0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
d7b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
d7c0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
d7d0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
d7e0: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
d7f0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
d800: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
d810: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
d820: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
d830: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
d840: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d850: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
d860: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
d870: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
d880: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d890: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
d8a0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
d8b0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
d8c0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
d8d0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d8e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
d8f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d900: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
d910: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
d920: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
d930: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
d940: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
d950: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
d960: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
d970: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
d980: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
d990: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
d9a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
d9b0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d9c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
d9d0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
d9e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
d9f0: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
da00: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
da10: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
da20: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
da30: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
da40: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
da50: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
da60: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
da70: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
da80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
da90: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
daa0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
dab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
dac0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
dad0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
dae0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
daf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
db00: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
db10: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
db20: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
db30: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
db40: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
db50: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
db60: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
db70: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
db80: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
db90: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
dba0: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
dbb0: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
dbc0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
dbd0: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
dbe0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
dbf0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
dc00: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
dc10: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
dc20: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
dc30: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
dc40: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
dc50: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
dc60: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
dc70: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
dc80: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
dc90: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
dca0: 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
dcb0: 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
dcc0: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
dcd0: 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rst];.  pPage->n
dce0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
dcf0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
dd00: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
dd10: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
dd20: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
dd30: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
dd40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
dd50: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
dd60: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
dd70: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
dd80: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
dd90: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
dda0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
ddb0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
ddc0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
ddd0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
dde0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
ddf0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
de00: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
de10: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
de20: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
de30: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
de40: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
de50: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
de60: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
de70: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
de80: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
de90: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
dea0: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
deb0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
dec0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
ded0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
dee0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
def0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
df00: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
df10: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
df20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
df30: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
df40: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
df50: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
df60: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
df70: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
df80: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
df90: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
dfa0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
dfb0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
dfc0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
dfd0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
dfe0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
dff0: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
e000: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
e010: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
e020: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
e030: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
e040: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
e050: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
e060: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
e070: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
e080: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
e090: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
e0a0: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
e0b0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
e0c0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
e0d0: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
e0e0: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
e0f0: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
e100: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
e110: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
e120: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
e130: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
e140: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
e150: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
e160: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
e170: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
e180: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
e190: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
e1a0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
e1b0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
e1c0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e1d0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
e1e0: 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
e1f0: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
e200: 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
e210: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
e220: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
e230: 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
e240: 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f  gs==PAGER_GET_NO
e250: 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73  CONTENT || flags
e260: 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
e270: 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74  ONLY );.  assert
e280: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e290: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
e2a0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
e2b0: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
e2c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
e2d0: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
e2e0: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
e2f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e300: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
e310: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
e320: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
e330: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
e340: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e350: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
e360: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
e370: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
e380: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
e390: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
e3a0: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
e3b0: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
e3c0: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
e3d0: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
e3e0: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
e3f0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
e400: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
e410: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
e420: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
e430: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
e440: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
e450: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
e460: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e470: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
e480: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
e490: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
e4a0: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
e4b0: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
e4c0: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
e4d0: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
e4e0: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
e4f0: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
e500: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e510: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e520: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
e530: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
e540: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
e550: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
e560: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
e570: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
e580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
e590: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
e5a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
e5b0: 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
e5c0: 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
e5d0: 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
e5e0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
e5f0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
e600: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
e610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
e620: 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
e630: 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
e640: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
e650: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
e660: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
e670: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
e680: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
e690: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
e6a0: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
e6b0: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
e6c0: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
e6d0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
e6e0: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
e6f0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
e700: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
e710: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e720: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
e730: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
e740: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
e750: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
e760: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
e770: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
e780: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
e790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
e7a0: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
e7b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
e7e0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
e7f0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
e800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e810: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
e820: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
e830: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
e840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
e850: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
e860: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
e870: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
e8a0: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
e8b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
e8c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e8d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e8e0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e8f0: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
e900: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
e910: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
e920: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
e930: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
e940: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
e950: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e960: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
e970: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
e980: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
e990: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
e9a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e9b0: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
e9c0: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
e9d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
e9e0: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
e9f0: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
ea00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ea10: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
ea20: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
ea30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ea40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
ea50: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
ea60: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
ea70: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
ea80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ea90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
eaa0: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
eab0: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
eac0: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
ead0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
eae0: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
eaf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
eb00: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
eb10: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
eb20: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
eb30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
eb40: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
eb50: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
eb60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
eb70: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
eb80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
eb90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
eba0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ebb0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ebc0: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
ebd0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
ebe0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
ebf0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
ec00: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
ec10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ec20: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ec30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
ec40: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
ec50: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
ec60: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
ec70: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
ec80: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
ec90: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
eca0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
ecb0: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
ecc0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
ecd0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
ece0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
ecf0: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
ed00: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
ed10: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
ed20: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
ed30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ed40: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
ed50: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
ed60: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
ed70: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
ed80: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
ed90: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
eda0: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
edb0: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
edc0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
edd0: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
ede0: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
edf0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
ee00: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
ee10: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ee20: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
ee30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
ee40: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
ee50: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
ee60: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
ee70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ee80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ee90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
eea0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
eeb0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
eec0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
eed0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
eee0: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
eef0: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
ef00: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
ef10: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
ef20: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
ef30: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
ef40: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
ef50: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
ef60: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
ef70: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
ef80: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
ef90: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
efa0: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
efb0: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
efc0: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
efd0: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
efe0: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
eff0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
f000: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
f010: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
f020: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
f030: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
f040: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
f050: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
f060: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
f070: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
f080: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
f090: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
f0a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f0b0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
f0c0: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
f0d0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
f0e0: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
f0f0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
f100: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
f110: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
f120: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
f130: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
f140: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f150: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
f160: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
f170: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
f180: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
f190: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
f1a0: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
f1b0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
f1c0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
f1d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
f1e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
f1f0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
f200: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
f210: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
f220: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
f230: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
f240: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
f250: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
f260: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
f270: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
f280: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
f290: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
f2a0: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
f2b0: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
f2c0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
f2d0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
f2e0: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
f2f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f300: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
f310: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
f320: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
f330: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
f340: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
f350: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
f360: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
f370: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
f380: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
f390: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
f3a0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
f3b0: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
f3c0: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
f3d0: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
f3e0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
f3f0: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
f400: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
f410: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
f420: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
f430: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f440: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
f450: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
f460: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
f470: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
f480: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
f490: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
f4a0: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
f4b0: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
f4c0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
f4d0: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
f4e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
f4f0: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
f500: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
f510: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
f520: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
f530: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
f540: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
f550: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
f560: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
f570: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
f580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f590: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
f5a0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
f5b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
f5c0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
f5d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f5e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
f5f0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
f600: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
f610: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
f620: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f630: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
f640: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
f650: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f670: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
f680: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
f690: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
f6a0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
f6b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
f6c0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
f6d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
f6f0: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
f700: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
f710: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
f740: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
f750: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
f760: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
f770: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
f780: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
f790: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
f7a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
f7b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
f7c0: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
f7d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
f7e0: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f800: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
f810: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
f820: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
f830: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
f840: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
f850: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
f860: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
f870: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
f880: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
f890: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
f8a0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
f8b0: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
f8c0: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
f8d0: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
f8e0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
f8f0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
f900: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
f910: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
f920: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
f930: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
f940: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
f950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f960: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
f970: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
f980: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
f990: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
f9a0: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
f9b0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
f9c0: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
f9f0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
fa00: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
fa30: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
fa40: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
fa50: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
fa60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
fa70: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fa80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fa90: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
faa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
fab0: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
fac0: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
fad0: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
fae0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
faf0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
fb00: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
fb10: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
fb20: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
fb30: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
fb40: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
fb50: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
fb60: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
fb70: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
fb80: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
fb90: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
fba0: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
fbb0: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
fbc0: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
fbd0: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
fbe0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
fbf0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
fc00: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
fc10: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
fc20: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
fc30: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
fc40: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
fc50: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
fc60: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
fc70: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
fc80: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
fc90: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
fca0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
fcb0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
fcc0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
fcd0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
fce0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fcf0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
fd00: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
fd10: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
fd20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
fd30: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
fd40: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
fd50: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
fd60: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
fd70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fd80: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fd90: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fda0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fdb0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
fdc0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
fdd0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
fde0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
fdf0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
fe00: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
fe10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
fe20: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
fe30: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
fe40: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
fe50: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
fe60: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
fe70: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
fe80: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
fe90: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
fea0: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
feb0: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
fec0: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
fed0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
fee0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
fef0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
ff00: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
ff10: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
ff20: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
ff30: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
ff40: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
ff50: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
ff60: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
ff70: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
ff80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ff90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ffa0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ffb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ffc0: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
ffd0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
ffe0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
fff0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
10000 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
10010 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
10020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10030 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
10040 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
10050 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
10080 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
10090 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
100a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
100b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
100c0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
100d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
100e0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
100f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10110 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
10120 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
10130 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
10140 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10150 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10160 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
10170 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10180 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10190 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
101a0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
101b0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
101c0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
101d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
101e0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
101f0 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
10200 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
10210 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10220 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10230 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
10240 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
10250 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
10260 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
10270 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
10280 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
10290 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
102a0 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
102b0 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
102c0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
102d0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
102e0 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
102f0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
10300 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
10310 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
10320 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
10330 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
10340 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
10350 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
10360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
10370 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
10380 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
10390 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
103a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
103b0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
103c0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
103d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
103e0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
103f0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
10400 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10410 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10430 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
10440 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10450 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
10460 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
10470 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
10480 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
10490 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
104a0 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
104b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
104c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
104e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
104f0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
10500 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
10510 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
10520 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
10530 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
10540 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
10550 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
10560 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
10570 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
10580 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
10590 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
105a0 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
105b0 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
105c0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
105d0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
105e0 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
105f0 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
10600 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
10610 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
10620 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
10630 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
10640 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
10650 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
10660 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
10670 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
10680 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
10690 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
106a0 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
106b0 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
106c0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
106d0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
106e0 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
106f0 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
10700 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
10710 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
10720 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
10730 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
10740 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
10750 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
10760 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
10770 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
10780 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
10790 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
107a0 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
107b0 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
107c0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
107d0 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
107e0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
107f0 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
10800 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
10810 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
10820 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
10830 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
10840 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
10850 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
10860 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10870 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
10880 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
10890 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
108a0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
108b0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
108c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
108f0 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
10900 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
10910 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10930 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
10940 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
10950 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
10960 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10970 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
10980 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
10990 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
109a0 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
109b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
109c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
109d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
109e0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
109f0 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
10a00 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
10a10 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
10a20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
10a30 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
10a40 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
10a50 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
10a60 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
10a70 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
10a80 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
10a90 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
10aa0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
10ab0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
10ac0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
10ad0 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
10ae0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10af0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
10b00 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
10b10 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
10b20 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
10b30 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
10b40 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
10b50 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
10b60 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
10b70 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
10b80 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
10b90 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
10ba0 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
10bb0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10bc0 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
10bd0 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
10be0 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
10bf0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
10c00 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
10c10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10c20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
10c30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10c40 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
10c50 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
10c60 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
10c70 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
10c80 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
10c90 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
10ca0 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
10cb0 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
10cc0 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
10cd0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
10ce0 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
10cf0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10d00 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
10d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
10d20 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
10d30 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
10d40 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
10d50 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
10d60 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
10d70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
10d80 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
10d90 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
10da0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10db0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10dc0 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
10dd0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
10de0 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
10df0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10e00 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
10e10 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
10e20 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
10e30 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
10e40 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
10e50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10e60 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
10e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10e80 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
10e90 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
10ea0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
10eb0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
10ec0 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
10ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10ee0 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
10ef0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10f00 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
10f10 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
10f20 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
10f30 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
10f40 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
10f50 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
10f60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
10f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10f80 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10f90 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
10fa0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
10fb0 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
10fc0 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
10fd0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
10fe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
10ff0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
11000 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
11010 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
11020 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
11030 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
11040 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
11050 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
11060 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11070 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
11080 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
11090 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
110a0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
110b0 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
110c0 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
110d0 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
110e0 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
110f0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
11100 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
11110 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
11120 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
11130 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
11140 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
11150 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
11160 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
11170 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
11180 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
11190 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
111a0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
111b0 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
111c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
111d0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
111e0 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
111f0 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
11200 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
11210 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
11220 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
11230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11250 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
11260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
11270 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
11280 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
11290 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
112a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
112b0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
112c0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
112d0 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
112e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
112f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11300 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
11310 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
11320 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
11330 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
11340 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
11350 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
11360 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
11370 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
11380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11390 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
113a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
113b0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
113c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
113d0 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
113e0 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
113f0 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
11400 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
11410 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
11420 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
11430 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
11440 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
11450 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
11460 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
11470 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
11480 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
11490 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
114a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
114b0 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
114c0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
114d0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
114e0 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
114f0 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
11500 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
11510 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
11520 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
11530 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
11540 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
11550 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
11560 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
11570 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
11580 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
11590 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
115a0 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
115b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
115c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
115d0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
115e0 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
115f0 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
11600 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
11610 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
11620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11630 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
11640 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
11650 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
11660 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
11670 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
11680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11690 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
116a0 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
116b0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
116c0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
116d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
116e0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
116f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
11700 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
11710 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
11720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11730 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
11740 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
11750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11760 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
11770 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
11780 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11790 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
117a0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
117b0 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
117c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
117d0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
117e0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
117f0 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
11800 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
11810 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
11820 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
11830 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
11840 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
11850 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
11860 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
11870 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
11880 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
11890 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
118a0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
118b0 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
118c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
118d0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
118e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
118f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
11900 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
11910 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
11920 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
11930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11940 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
11950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
11960 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
11970 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
11980 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11990 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
119a0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
119b0 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
119c0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
119d0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
119e0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
119f0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
11a00 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
11a10 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
11a20 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
11a30 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
11a40 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
11a50 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
11a60 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
11a70 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
11a80 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
11a90 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ab0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
11ac0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
11ad0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
11ae0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
11af0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
11b00 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
11b10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11b20 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
11b30 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11b40 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
11b50 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
11b60 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
11b70 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
11b80 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
11b90 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11ba0 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
11bb0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
11bc0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
11bd0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
11be0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
11bf0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
11c00 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
11c10 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
11c20 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11c30 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
11c40 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
11c50 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
11c60 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
11c70 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
11c80 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
11c90 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
11ca0 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
11cb0 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
11cc0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
11cd0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
11ce0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
11cf0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
11d00 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
11d10 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
11d20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
11d30 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
11d40 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
11d50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
11d60 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
11d70 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
11d80 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
11d90 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
11da0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11db0 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
11dc0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11dd0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
11de0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
11df0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
11e00 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
11e10 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
11e20 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
11e30 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
11e40 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
11e50 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
11e60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
11e70 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
11e80 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11e90 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
11ea0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
11eb0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
11ec0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
11ed0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
11ee0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
11ef0 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
11f00 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
11f10 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
11f20 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
11f30 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
11f40 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
11f50 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
11f60 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
11f70 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
11f80 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
11f90 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
11fa0 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
11fb0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
11fc0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
11fd0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
11fe0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
11ff0 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
12000 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
12010 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
12020 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
12030 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
12040 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
12050 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
12060 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
12070 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
12080 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
12090 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
120a0 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
120b0 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
120c0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
120d0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
120e0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
120f0 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
12100 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
12110 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
12120 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
12130 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
12140 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
12150 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
12160 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12170 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
12180 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
12190 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
121a0 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
121b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
121c0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
121d0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
121e0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
121f0 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
12200 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
12210 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
12220 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
12230 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
12240 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
12250 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
12260 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
12270 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
12280 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
12290 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
122a0 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
122b0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
122c0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
122d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
122e0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
122f0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
12300 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
12310 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
12320 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
12330 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
12340 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
12350 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
12360 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
12370 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
12380 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
12390 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
123a0 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
123b0 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
123c0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
123d0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
123e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
123f0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
12400 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
12410 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
12420 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
12430 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
12440 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12450 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
12460 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
12470 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12480 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
12490 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
124a0 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
124b0 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
124c0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
124d0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
124e0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
124f0 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
12500 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
12510 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
12520 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
12530 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
12540 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
12550 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
12560 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
12570 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
12580 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
12590 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
125a0 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
125b0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
125c0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
125d0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
125e0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
125f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12600 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
12610 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
12620 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
12630 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12640 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
12650 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
12660 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
12670 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
12680 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
12690 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
126a0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
126b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
126c0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
126d0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
126e0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
126f0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
12700 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
12710 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
12720 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
12730 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
12740 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
12750 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
12760 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
12770 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
12780 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
12790 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
127a0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
127b0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
127c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
127d0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
127e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
127f0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
12800 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
12810 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
12820 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
12830 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
12840 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
12850 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
12860 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
12870 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
12880 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
12890 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
128a0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
128b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
128c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
128d0 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
128e0 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
128f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
12900 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
12910 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
12920 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
12930 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
12940 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
12950 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
12960 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
12970 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12990 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
129a0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
129b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
129c0 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
129d0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
129e0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
129f0 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
12a00 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
12a10 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
12a20 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
12a30 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
12a40 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
12a50 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
12a60 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
12a70 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
12a80 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
12a90 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
12aa0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
12ab0 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
12ac0 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
12ad0 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
12ae0 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
12af0 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
12b00 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
12b10 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
12b20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
12b30 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
12b40 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
12b50 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
12b60 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
12b70 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
12b80 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
12b90 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
12ba0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
12bb0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
12bc0 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
12bd0 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
12be0 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
12bf0 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
12c00 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
12c10 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
12c20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
12c30 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
12c40 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
12c50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12c60 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
12c70 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
12c80 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
12c90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12ca0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12cb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
12cc0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12cd0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ce0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
12cf0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
12d00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
12d10 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12d20 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12d40 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
12d50 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
12d60 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
12d70 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
12d80 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
12d90 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
12da0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
12db0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
12dc0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
12dd0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
12de0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
12df0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
12e00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12e10 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
12e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12e30 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
12e40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12e50 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
12e60 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
12e70 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
12e80 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
12e90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12ea0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12eb0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
12ec0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
12ed0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
12ee0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
12ef0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
12f00 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
12f10 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
12f20 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
12f30 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
12f40 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
12f50 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
12f60 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
12f70 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
12f80 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
12f90 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
12fa0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
12fb0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
12fc0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
12fd0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
12fe0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
12ff0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
13000 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
13010 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
13020 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
13030 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
13040 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
13050 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
13060 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
13070 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
13080 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
13090 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
130a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
130b0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
130c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
130d0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
130e0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
130f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
13100 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
13110 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
13120 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
13130 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
13140 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
13150 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
13160 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13170 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
13180 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13190 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
131a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
131b0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
131c0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
131d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
131e0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
131f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13210 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
13220 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
13230 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
13240 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
13250 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
13260 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
13270 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
13280 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
13290 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
132a0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
132b0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
132c0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
132d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
132e0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
132f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13300 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13310 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
13320 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
13330 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
13340 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
13350 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
13360 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
13370 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
13380 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13390 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
133a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
133b0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
133c0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
133d0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
133e0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
133f0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
13400 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
13410 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
13420 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
13430 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
13440 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
13450 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
13460 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
13470 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
13480 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
13490 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
134a0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
134b0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
134c0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
134d0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
134e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
134f0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
13500 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
13510 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
13520 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
13530 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
13540 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
13550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13560 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
13570 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
13580 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
13590 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
135a0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
135b0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
135c0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
135d0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
135e0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
135f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
13600 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
13610 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
13620 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
13630 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
13640 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
13650 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
13660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
13670 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
13680 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13690 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
136a0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
136b0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
136c0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
136d0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
136e0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
136f0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
13700 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
13710 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
13720 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
13730 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
13740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
13750 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13760 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
13770 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
13780 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
13790 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
137a0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
137b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
137c0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
137d0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
137e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
137f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13800 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
13810 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
13820 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
13830 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
13840 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
13850 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
13860 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
13870 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
13880 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
13890 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
138a0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
138b0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
138c0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
138d0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
138e0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
138f0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13900 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
13910 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
13920 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
13930 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
13940 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
13950 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
13960 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
13970 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13980 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13990 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
139a0 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
139b0 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
139c0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
139d0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
139e0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
139f0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
13a00 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13a10 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
13a20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
13a50 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
13a60 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
13a70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13a80 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
13a90 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
13aa0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
13ab0 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  e;.}..#if define
13ac0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
13ad0 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
13ae0 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
13af0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13b00 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
13b10 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
13b20 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
13b30 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
13b40 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
13b50 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
13b60 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
13b70 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
13b80 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
13b90 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
13ba0 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
13bb0 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
13bc0 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
13bd0 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
13be0 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
13bf0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
13c00 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
13c10 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
13c20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13c30 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
13c40 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
13c50 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
13c60 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
13c70 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
13c80 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
13c90 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
13ca0 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
13cb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
13cc0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
13cd0 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
13ce0 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
13cf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13d00 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
13d10 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
13d20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13d30 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
13d40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
13d50 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
13d60 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
13d70 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23  >usableSize;.}.#
13d80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13d90 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c  HAS_CODEC || SQL
13da0 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
13db0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13dc0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13dd0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
13de0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
13df0 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  CUUM)./*.** Retu
13e00 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
13e10 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
13e20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
13e30 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
13e40 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
13e50 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
13e60 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
13e70 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
13e80 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
13e90 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
13ea0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
13eb0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
13ec0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
13ed0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
13ee0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13ef0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
13f00 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
13f10 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
13f20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13f30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
13f40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
13f50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
13f60 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
13f70 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
13f80 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
13f90 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
13fa0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
13fb0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
13fc0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
13fd0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
13fe0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
13ff0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
14000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14010 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
14020 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
14030 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
14040 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
14050 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
14060 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
14070 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
14080 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
14090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
140a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
140b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
140c0 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
140d0 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
140e0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
140f0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
14100 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
14110 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
14120 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
14130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
14140 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
14150 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
14160 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
14170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14180 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
14190 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
141a0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
141b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
141c0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
141d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
141e0 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
141f0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
14200 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
14210 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
14220 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
14230 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
14240 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
14250 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
14260 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
14270 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
14280 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
14290 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
142a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
142b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
142c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
142d0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
142e0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
142f0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
14300 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
14310 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
14320 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
14330 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
14340 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
14350 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
14360 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
14370 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
14380 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
14390 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
143a0 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
143b0 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
143c0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
143d0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
143e0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
143f0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
14400 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
14410 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
14420 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
14430 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
14440 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
14450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14460 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
14480 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
14490 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
144a0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
144b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
144c0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
144d0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
144e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
144f0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
14500 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
14510 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
14520 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
14530 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
14540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14550 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
14560 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
14570 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
14580 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
14590 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
145a0 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
145b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
145c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
145d0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
145e0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
145f0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
14600 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
14610 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
14620 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
14630 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
14640 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
14650 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
14660 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
14670 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14680 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
14690 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
146a0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
146b0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
146c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
146d0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
146e0 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
146f0 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
14700 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
14710 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
14720 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
14730 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
14740 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
14750 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
14760 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14770 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14780 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
14790 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
147a0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
147b0 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
147c0 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
147d0 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
147e0 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
147f0 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
14800 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
14810 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
14820 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
14830 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
14840 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
14850 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
14860 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
14870 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
14880 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
14890 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
148a0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
148b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
148c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
148d0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
148e0 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
148f0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
14900 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14910 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
14920 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
14930 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
14940 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
14950 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
14960 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
14970 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14980 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
14990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
149a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
149b0 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
149c0 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
149d0 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
149e0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
149f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
14a00 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
14a10 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
14a20 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
14a30 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
14a40 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
14a50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14a60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14a70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
14a80 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
14a90 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
14aa0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
14ab0 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
14ac0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
14ad0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
14ae0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
14af0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
14b00 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
14b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
14b30 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
14b40 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
14b50 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
14b60 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
14b70 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
14b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14b90 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
14ba0 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
14bb0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
14bc0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
14bd0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
14be0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
14bf0 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
14c00 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
14c10 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
14c20 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
14c30 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
14c40 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
14c50 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
14c60 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
14c70 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
14c80 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
14c90 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
14ca0 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
14cb0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
14cc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14cd0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
14ce0 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
14cf0 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
14d00 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
14d10 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
14d20 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
14d30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
14d40 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
14d50 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
14d60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14d70 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
14d80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
14d90 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
14da0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14db0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14dc0 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
14dd0 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
14de0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14df0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
14e00 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
14e10 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
14e20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14e30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
14e40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
14e50 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
14e60 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
14e70 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
14e80 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
14e90 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
14ea0 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
14eb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14ec0 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
14ed0 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
14ee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
14ef0 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
14f00 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
14f10 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
14f20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
14f30 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
14f40 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
14f50 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
14f60 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
14f70 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
14f80 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
14f90 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
14fa0 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
14fb0 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
14fc0 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
14fd0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
14fe0 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
14ff0 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
15000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15010 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
15020 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
15030 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
15040 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
15050 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
15060 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15070 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
15080 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
15090 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
150a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
150b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
150c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
150d0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
150e0 6e 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  n==0 ){.#ifdef S
150f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
15100 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a 20 20  L_SAFETYLEVEL.  
15110 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
15120 20 74 6f 20 73 70 65 63 69 66 69 65 64 20 73 61   to specified sa
15130 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 57  fety_level for W
15140 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  AL mode */.     
15150 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 21 3d     if( pBt->db!=
15160 30 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e 61 44  0 && pBt->db->aD
15170 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b!=0 ){.        
15180 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
15190 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
151a0 20 3d 20 70 42 74 2d 3e 64 62 3b 0a 20 20 20 20   = pBt->db;.    
151b0 20 20 20 20 20 20 44 62 20 2a 61 44 62 20 3d 20        Db *aDb = 
151c0 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20 20 20 20  db->aDb;.       
151d0 20 20 20 75 38 20 6c 65 76 65 6c 20 3d 20 30 3b     u8 level = 0;
151e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
151f0 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
15200 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  b; iDb++){.     
15210 20 20 20 20 20 20 20 69 66 28 20 61 44 62 5b 69         if( aDb[i
15220 44 62 5d 2e 70 42 74 20 26 26 20 61 44 62 5b 69  Db].pBt && aDb[i
15230 44 62 5d 2e 70 42 74 2d 3e 70 42 74 3d 3d 70 42  Db].pBt->pBt==pB
15240 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  t ) break;.     
15250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15260 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
15270 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20  >nDb );.        
15280 20 20 6c 65 76 65 6c 20 3d 20 64 62 2d 3e 61 44    level = db->aD
15290 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65  b[iDb].safety_le
152a0 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  vel;.          i
152b0 66 28 20 21 53 51 4c 49 54 45 5f 44 62 53 61 66  f( !SQLITE_DbSaf
152c0 65 74 79 4c 65 76 65 6c 49 73 46 69 78 65 64 28  etyLevelIsFixed(
152d0 6c 65 76 65 6c 29 20 26 26 20 0a 20 20 20 20 20  level) && .     
152e0 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
152f0 44 62 53 61 66 65 74 79 4c 65 76 65 6c 56 61 6c  DbSafetyLevelVal
15300 75 65 28 6c 65 76 65 6c 29 20 21 3d 20 53 51 4c  ue(level) != SQL
15310 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
15320 53 41 46 45 54 59 4c 45 56 45 4c 29 20 29 7b 0a  SAFETYLEVEL) ){.
15330 20 20 20 20 20 20 20 20 20 20 20 20 61 44 62 5b              aDb[
15340 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  iDb].safety_leve
15350 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  l = SQLITE_DEFAU
15360 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
15370 45 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EL;.            
15380 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
15390 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
153a0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
153b0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
153c0 59 4c 45 56 45 4c 2c 20 0a 20 20 20 20 20 20 20  YLEVEL, .       
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
15400 45 5f 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 2c  E_FullFSync)!=0,
15410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61          (db->fla
15440 67 73 26 53 51 4c 49 54 45 5f 43 6b 70 74 46 75  gs&SQLITE_CkptFu
15450 6c 6c 46 53 79 6e 63 29 21 3d 30 29 3b 0a 20 20  llFSync)!=0);.  
15460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
15480 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15490 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
154a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
154b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
154d0 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
154e0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
154f0 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
15500 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
15510 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
15520 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
15530 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
15540 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
15550 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
15560 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
15570 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
15580 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
15590 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
155a0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
155b0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
155c0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
155d0 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
155e0 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
155f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15600 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
15610 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
15620 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
15630 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15640 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
15650 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
15660 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
15670 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
15680 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
15690 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
156a0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
156b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
156c0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
156d0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
156e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
156f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
15700 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
15710 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
15720 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
15730 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
15740 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
15750 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
15760 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
15770 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
15780 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
15790 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
157a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
157b0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
157c0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
157d0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
157e0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
157f0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
15800 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
15810 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
15820 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
15830 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
15840 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
15850 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
15860 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
15870 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
15880 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
15890 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
158a0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
158b0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
158c0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
158d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
158e0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
158f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15900 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
15910 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
15920 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
15930 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
15940 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
15950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15960 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
15970 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
15980 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
159b0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
159c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
159d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
159e0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
159f0 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
15a00 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
15a10 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
15a20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15a30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
15a40 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15a50 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15a60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61     }.    if( usa
15a70 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
15a80 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15a90 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15aa0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
15ab0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
15ac0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15ad0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
15ae0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
15af0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15b00 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
15b10 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15b20 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
15b30 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
15b40 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
15b50 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
15b60 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
15b70 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
15b80 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
15b90 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
15ba0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
15bb0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
15bc0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
15bd0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
15be0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
15bf0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
15c00 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
15c10 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
15c20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
15c30 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
15c40 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
15c50 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
15c60 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
15c70 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
15c80 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
15c90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
15ca0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
15cb0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
15cc0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
15cd0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
15ce0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
15cf0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
15d00 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
15d10 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
15d20 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
15d30 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
15d40 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
15d50 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
15d60 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
15d70 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
15d80 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
15d90 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
15da0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
15db0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
15dc0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
15dd0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
15de0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
15df0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
15e00 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
15e10 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
15e20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
15e30 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
15e40 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
15e50 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
15e60 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
15e70 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
15e80 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
15e90 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
15ea0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
15eb0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
15ec0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
15ed0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
15ee0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
15ef0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
15f00 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
15f10 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
15f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
15f30 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
15f40 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
15f50 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
15f60 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
15f70 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
15f80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15f90 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
15fa0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
15fb0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
15fc0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
15fd0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
15fe0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
15ff0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
16000 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
16010 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
16020 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
16030 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
16040 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
16050 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
16060 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
16070 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
16080 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
16090 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
160a0 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
160b0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
160c0 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
160d0 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
160e0 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
160f0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
16100 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
16110 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
16120 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
16130 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
16140 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
16150 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
16160 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
16170 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
16180 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
16190 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
161a0 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
161b0 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
161c0 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
161d0 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
161e0 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
161f0 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
16200 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
16210 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
16220 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
16230 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
16240 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
16250 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
16260 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
16270 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
16280 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
16290 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
162a0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
162b0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
162c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
162d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
162e0 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
162f0 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
16300 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
16310 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
16320 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
16330 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
16340 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
16350 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
16360 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
16370 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
16380 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
16390 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
163a0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
163b0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
163c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
163d0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
163e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
163f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
16400 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
16410 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
16420 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
16430 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
16440 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16450 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
16460 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
16470 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
16480 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
16490 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
164a0 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
164b0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
164c0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
164d0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
164e0 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
164f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
16500 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
16510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
16520 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
16530 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
16540 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
16550 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
16560 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
16570 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
16580 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ge(pPage1);.  }.
16590 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
165a0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
165b0 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
165c0 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
165d0 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
165e0 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
165f0 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
16600 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
16610 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
16620 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
16630 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
16640 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16650 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
16660 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16670 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
16680 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16690 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
166a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
166b0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
166c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
166d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
166e0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
166f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
16700 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
16710 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
16720 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16730 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
16740 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
16750 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
16760 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
16770 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
16780 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
16790 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
167a0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
167b0 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
167c0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
167d0 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
167e0 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
167f0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
16800 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
16810 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
16820 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
16830 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
16840 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
16850 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
16860 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
16870 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
16880 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
16890 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
168a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
168b0 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
168c0 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
168d0 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
168e0 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
168f0 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
16900 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
16910 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
16920 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
16930 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
16940 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
16950 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
16960 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16970 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16980 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
16990 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
169a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
169b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
169c0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
169d0 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
169e0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
169f0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
16a00 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
16a10 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
16a20 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
16a30 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
16a40 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
16a50 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
16a60 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
16a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16a80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
16a90 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
16aa0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
16ab0 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
16ac0 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
16ad0 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
16ae0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
16af0 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
16b00 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
16b10 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
16b20 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
16b30 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16b40 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
16b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16b60 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
16b70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
16b80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16b90 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
16ba0 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
16bb0 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
16bc0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
16bd0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16bf0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
16c00 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
16c10 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
16c20 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
16c30 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
16c40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
16c50 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
16c60 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
16c70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
16c80 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
16c90 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
16ca0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
16cb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
16cc0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
16cd0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
16ce0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
16cf0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
16d00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
16d10 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
16d20 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
16d30 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
16d40 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
16d50 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
16d60 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
16d70 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
16d80 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
16d90 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
16da0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
16db0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
16dc0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
16dd0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
16de0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
16df0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
16e00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
16e10 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
16e20 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
16e30 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
16e40 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
16e50 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
16e60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
16e70 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
16e80 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
16e90 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
16ea0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
16eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
16ec0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
16ed0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
16ee0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
16ef0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
16f00 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
16f10 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
16f20 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
16f30 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
16f40 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
16f50 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
16f60 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
16f70 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
16f80 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
16f90 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
16fa0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
16fb0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
16fc0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
16fd0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
16fe0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
16ff0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
17000 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
17010 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
17020 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
17030 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
17040 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
17050 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
17060 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
17070 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
17080 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
17090 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
170a0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
170b0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
170c0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
170d0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
170e0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
170f0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
17100 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
17110 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
17120 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
17130 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
17140 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
17150 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
17160 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
17170 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
17180 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
17190 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
171a0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
171b0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
171c0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
171d0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
171e0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
171f0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
17200 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
17210 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
17220 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
17230 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
17240 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
17250 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
17260 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
17270 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
17280 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17290 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
172a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
172b0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
172c0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
172d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
172e0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
172f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
17300 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17310 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
17320 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
17330 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
17340 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
17350 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
17360 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
17370 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
17380 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
17390 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
173a0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
173b0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
173c0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
173d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
173e0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
173f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
17400 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
17410 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
17420 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
17430 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
17440 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
17450 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
17460 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
17470 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
17480 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
17490 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
174a0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
174b0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
174c0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
174d0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
174e0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
174f0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
17500 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17510 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
17520 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
17530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17540 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
17550 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
17560 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
17570 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
17580 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
17590 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
175a0 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
175b0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
175c0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
175d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
175e0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
175f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
17600 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
17610 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
17620 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
17630 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c  RANS_WRITE).   |
17640 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
17650 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
17660 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f  =0.  ){.    pBlo
17670 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
17680 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
17690 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
176a0 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
176b0 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
176c0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
176d0 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
176e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
176f0 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
17700 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
17710 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
17720 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
17730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
17740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
17750 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
17760 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
17770 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
17780 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
17790 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
177a0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
177b0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
177c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
177d0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
177e0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
177f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
17800 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
17810 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
17820 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
17830 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
17840 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
17850 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
17860 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
17870 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
17880 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
17890 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
178a0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
178b0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
178c0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
178d0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
178e0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
178f0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
17900 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
17910 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
17920 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
17930 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
17940 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
17950 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
17960 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
17970 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
17980 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
17990 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
179a0 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
179b0 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
179c0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
179d0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
179e0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
179f0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
17a00 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
17a10 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
17a20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
17a30 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
17a40 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
17a50 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
17a60 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
17a70 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
17a80 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
17a90 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
17aa0 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
17ab0 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
17ac0 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
17ad0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
17ae0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
17af0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
17b00 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
17b10 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
17b20 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
17b30 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
17b40 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
17b50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
17b60 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
17b70 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17b80 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
17b90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
17ba0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17bb0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
17bc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
17bd0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
17be0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
17bf0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
17c00 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
17c10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17c30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
17c40 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
17c50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17c60 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
17c70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17c80 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
17c90 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
17ca0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
17cb0 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
17cc0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
17cd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17ce0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
17cf0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
17d00 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
17d10 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
17d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17d30 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
17d40 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
17d50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
17d60 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
17d70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17d80 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
17d90 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
17da0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
17db0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
17dc0 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
17dd0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
17de0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
17df0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
17e00 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
17e10 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
17e20 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
17e30 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
17e40 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
17e50 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
17e60 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
17e70 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
17e80 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
17e90 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
17ea0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
17eb0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
17ec0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17ed0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
17ee0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
17ef0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
17f00 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
17f10 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
17f20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17f30 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
17f40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
17f50 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
17f60 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
17f70 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
17f80 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
17f90 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
17fa0 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
17fb0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17fc0 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
17fd0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
17fe0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
17ff0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
18000 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
18010 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
18020 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
18030 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
18040 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
18050 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
18060 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
18070 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
18080 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
18090 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
180a0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
180b0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
180c0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
180d0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
180e0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
180f0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
18100 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
18110 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
18120 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
18130 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
18140 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
18150 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
18160 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
18170 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
18180 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
18190 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
181a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
181b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
181c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
181d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
181e0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
181f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
18200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18210 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
18220 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
18230 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
18240 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
18250 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
18260 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
18270 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
18280 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
18290 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
182a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
182b0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
182c0 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
182d0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
182e0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
182f0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
18300 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
18310 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
18320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18330 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
18340 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
18350 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
18360 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
18370 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
18380 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18390 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
183a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
183b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
183c0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
183d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
183e0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
183f0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
18400 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
18410 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
18420 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
18430 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
18440 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
18450 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
18460 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
18470 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
18480 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
18490 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
184a0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
184b0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
184e0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
184f0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18510 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18520 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
18530 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
18540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18560 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
18570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
18580 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
18590 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
185a0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
185b0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
185c0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
185d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
185e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
185f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
18600 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
18610 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
18620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18630 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
18640 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
18650 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
18660 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
18670 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
18680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
18690 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
186a0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
186b0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
186c0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
186d0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
186e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
186f0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
18700 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
18710 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
18720 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
18730 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
18740 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
18750 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
18760 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
18770 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
18780 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
18790 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
187a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
187b0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
187c0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
187d0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
187e0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
187f0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
18800 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
18810 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
18820 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
18830 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
18840 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
18850 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
18860 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
18870 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
18880 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
18890 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
188a0 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
188b0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
188c0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
188d0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
188e0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
188f0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
18900 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
18910 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
18920 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
18930 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
18940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
18950 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
18960 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
18970 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
18980 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
18990 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
189a0 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
189d0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
189e0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
189f0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
18a00 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
18a10 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
18a20 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
18a30 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
18a40 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
18a50 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
18a60 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
18a70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
18a80 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
18a90 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
18aa0 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
18ab0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
18ac0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
18ad0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
18ae0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
18af0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
18b00 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
18b10 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
18b20 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
18b30 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
18b40 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
18b50 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
18b60 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
18b70 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
18b80 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
18b90 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
18ba0 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
18bb0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
18bc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18bd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18be0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
18bf0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
18c00 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
18c10 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
18c20 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
18c30 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
18c40 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
18c50 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
18c60 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
18c70 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
18c80 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
18c90 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
18ca0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
18cb0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
18cc0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
18cd0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
18ce0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
18cf0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
18d00 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
18d10 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18d20 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
18d30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
18d40 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
18d50 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
18d60 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
18d70 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
18d80 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
18d90 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
18da0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
18db0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
18dc0 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
18dd0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
18de0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
18df0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
18e00 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
18e10 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
18e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e30 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
18e40 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
18e50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
18e60 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
18e70 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
18e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18e90 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
18ea0 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
18eb0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
18ec0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
18ed0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
18ee0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
18ef0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
18f00 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
18f10 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18f20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18f30 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
18f40 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
18f50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
18f60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
18f70 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
18f80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
18f90 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
18fa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18fb0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
18fc0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
18fd0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
18fe0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
18ff0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
19000 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
19010 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
19020 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
19030 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
19040 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
19050 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
19060 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
19070 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
19080 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
19090 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
190a0 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
190b0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
190c0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
190d0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
190e0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
190f0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
19100 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
19110 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
19120 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
19130 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
19140 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
19150 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
19160 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
19170 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
19180 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
19190 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
191a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
191b0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
191c0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
191d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
191e0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
191f0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
19200 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
19210 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
19220 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
19230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
19240 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
19250 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
19260 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
19270 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
19280 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
19290 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
192a0 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
192b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
192c0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
192d0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
192e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
192f0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
19300 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
19310 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
19320 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
19330 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
19340 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
19350 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
19360 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
19370 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
19380 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
19390 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
193a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
193b0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
193c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
193d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
193e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
193f0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
19400 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
19410 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
19420 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
19430 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
19440 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
19450 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
19460 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
19470 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
19480 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
19490 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
194a0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
194b0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
194c0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
194d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
194e0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
194f0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
19500 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
19510 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
19520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19540 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
19550 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
19560 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
19570 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
19580 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
19590 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
195a0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
195b0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
195c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
195d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
195e0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
195f0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
19600 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
19610 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
19620 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
19630 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
19640 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
19650 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
19660 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
19670 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
19680 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
19690 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
196a0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
196b0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
196c0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
196d0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
196e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
196f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
19700 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
19710 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
19720 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
19730 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
19740 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
19750 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19760 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
19790 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
197a0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
197b0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
197c0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
197d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
197e0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
197f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
19800 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
19810 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19830 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19850 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
19860 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
19870 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
19880 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
19890 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
198a0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
198b0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
198c0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
198d0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
198e0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
198f0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
19900 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
19910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
19920 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
19930 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
19940 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
19950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
19980 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19990 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
199a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
199b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
199c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
199d0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
199e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
199f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
19a00 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
19a10 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
19a20 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
19a30 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
19a40 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
19a50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
19a70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
19a80 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
19a90 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
19aa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
19ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
19ac0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
19ad0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
19ae0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
19af0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
19b00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
19b10 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
19b20 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
19b30 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
19b40 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
19b50 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
19b60 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
19b70 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19b80 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
19b90 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
19ba0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
19bb0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
19bc0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
19bd0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
19be0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
19bf0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
19c00 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
19c10 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
19c20 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
19c30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
19c40 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
19c50 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
19c60 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
19c70 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
19c80 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
19c90 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
19ca0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
19cb0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
19cc0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
19cd0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
19ce0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
19cf0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
19d00 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
19d10 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
19d20 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
19d30 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
19d40 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
19d50 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
19d60 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
19d70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
19d80 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
19d90 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
19da0 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
19db0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
19dc0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
19dd0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
19de0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
19df0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
19e00 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
19e10 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
19e20 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
19e30 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
19e40 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
19e50 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
19e60 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
19e70 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
19e80 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
19e90 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
19ea0 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
19eb0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
19ec0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
19ed0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19ee0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
19ef0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
19f00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
19f10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19f20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19f30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
19f40 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
19f50 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
19f60 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
19f70 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
19f80 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
19f90 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
19fa0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
19fb0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
19fc0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
19fd0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
19fe0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19ff0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1a000 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1a010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a020 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1a030 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1a040 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1a050 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1a060 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a090 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1a0a0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1a0b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a0c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1a0d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1a0e0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1a0f0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1a100 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1a110 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1a120 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1a130 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1a140 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1a150 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1a160 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1a170 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1a180 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1a190 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1a1a0 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1a1b0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1a1c0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1a1d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1a1e0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1a1f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1a200 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1a210 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1a220 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1a230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1a240 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1a250 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1a260 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1a270 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1a280 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1a290 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1a2a0 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1a2b0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1a2c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1a300 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1a310 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1a320 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1a330 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1a340 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1a350 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a370 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1a380 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1a390 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1a3a0 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1a3b0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1a3c0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1a3d0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1a3e0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1a3f0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1a400 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1a410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1a420 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1a430 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1a440 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1a450 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1a460 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1a470 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1a480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a4a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a4b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1a4c0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1a4d0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1a4e0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1a4f0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1a500 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1a510 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1a520 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1a530 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1a540 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1a550 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1a560 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1a570 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1a580 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1a590 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1a5a0 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1a5b0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1a5c0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1a5d0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1a5e0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1a5f0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1a600 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a610 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1a620 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1a630 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1a640 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1a650 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1a660 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1a670 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1a680 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1a690 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1a6a0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1a6b0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1a6c0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1a6d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1a6f0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1a700 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1a710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1a720 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1a730 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1a740 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1a750 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1a760 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1a770 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1a780 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1a790 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1a7a0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1a7b0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1a7c0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1a7d0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1a7e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1a7f0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1a800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a810 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a820 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1a830 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1a840 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1a850 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1a860 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1a870 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1a880 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1a890 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1a8a0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1a8b0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1a8c0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1a8d0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1a8e0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1a8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1a910 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1a920 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1a930 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1a940 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1a950 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1a960 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1a970 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1a980 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1a990 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1a9a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a9b0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1a9c0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1a9d0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1a9e0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1a9f0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1aa00 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1aa10 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1aa20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1aa50 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1aa60 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1aa70 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1aaa0 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1aab0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1aac0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1aad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1aae0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1aaf0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1ab00 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1ab10 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1ab20 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1ab30 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1ab40 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1ab50 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1ab60 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1ab70 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1ab80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1ab90 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1aba0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1abb0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1abc0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1abd0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1abe0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1abf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ac00 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1ac10 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1ac20 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1ac30 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1ac40 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1ac50 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1ac60 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ac70 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1ac80 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1ac90 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1aca0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1acb0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1acc0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1acd0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1ace0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1acf0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1ad00 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1ad10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1ad20 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1ad30 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1ad40 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1ad50 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ad60 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1ad70 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1ad80 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1ad90 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1ada0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1adb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1adc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1add0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1ade0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1adf0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1ae00 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ae10 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1ae20 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1ae30 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1ae40 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1ae50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1ae60 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1ae70 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1ae80 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1ae90 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1aea0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1aeb0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1aec0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1aed0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1aee0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1aef0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1af00 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1af10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1af20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1af30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1af40 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1af50 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1af60 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1af70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1af80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1af90 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1afa0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1afb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1afc0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1afd0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1afe0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1aff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1b010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b020 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1b030 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1b040 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b050 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1b060 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1b070 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1b090 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1b0a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1b0b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b0c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b0d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1b0e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1b0f0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1b100 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1b110 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1b120 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1b130 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1b140 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1b150 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1b160 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1b170 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1b180 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1b190 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1b1a0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1b1b0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1b1c0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1b1d0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1b1e0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1b1f0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1b200 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1b210 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1b220 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1b230 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1b240 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1b250 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1b260 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1b270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b280 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1b290 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1b2a0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1b2b0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1b2c0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1b2d0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
1b2e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1b2f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1b300 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1b310 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1b320 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1b330 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1b340 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1b350 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1b360 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1b370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b380 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1b390 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1b3a0 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1b3b0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1b3c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1b3d0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1b3e0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1b3f0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1b400 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1b410 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1b420 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1b430 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1b440 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1b450 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1b460 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1b470 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1b480 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1b490 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1b4a0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1b4b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1b4c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1b4d0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1b4e0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1b4f0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1b500 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1b510 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1b520 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1b530 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1b540 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1b550 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1b560 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1b570 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1b580 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1b590 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1b5a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1b5b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1b5c0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1b5d0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1b5e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1b5f0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1b600 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1b610 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1b620 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1b630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1b640 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1b650 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1b660 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1b670 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1b680 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1b690 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1b6a0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1b6b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1b6c0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1b6d0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1b6e0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1b6f0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1b700 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1b710 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1b720 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1b730 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1b740 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b750 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1b760 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1b770 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1b780 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1b790 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1b7a0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1b7b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1b7c0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1b7d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1b7e0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1b7f0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1b800 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1b810 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1b820 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1b830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1b850 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1b860 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1b870 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1b880 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1b890 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1b8a0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1b8b0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1b8c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b8d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1b8e0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1b8f0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1b900 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1b910 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b920 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1b930 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1b940 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1b950 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1b960 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1b970 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1b980 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1b990 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1b9a0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1b9b0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1b9c0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1b9d0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1b9e0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1b9f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1ba00 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1ba10 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1ba20 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1ba30 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1ba40 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1ba50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1ba60 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1ba70 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1ba80 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1ba90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1baa0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1bab0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1bac0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1bad0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1bae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1baf0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1bb00 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1bb10 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1bb20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1bb30 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1bb40 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1bb50 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1bb60 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1bb70 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1bb80 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1bb90 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1bba0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1bbb0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1bbc0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1bbd0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1bbe0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1bbf0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1bc00 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1bc10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1bc20 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1bc30 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1bc40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1bc50 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1bc60 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1bc70 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1bc80 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1bc90 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1bca0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1bcb0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1bcc0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1bcd0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1bce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1bcf0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1bd00 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1bd10 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1bd20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1bd30 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1bd40 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1bd50 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1bd60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1bd70 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1bd80 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1bd90 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1bda0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1bdb0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1bdc0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1bdd0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1bde0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1bdf0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1be00 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1be10 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1be20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1be30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1be40 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1be50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1be60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1be70 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1be80 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1be90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1bea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1beb0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1bec0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1bed0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1bee0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1bef0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1bf00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1bf10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bf20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1bf30 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1bf40 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1bf50 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1bf60 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1bf70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bf80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1bf90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bfa0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1bfb0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1bfc0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1bfd0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1bfe0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1bff0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1c000 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1c010 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1c020 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1c030 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1c040 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1c050 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1c060 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1c070 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c080 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c090 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c0a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1c0b0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1c0c0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1c0d0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1c0e0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1c0f0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1c100 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1c110 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1c120 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1c130 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1c140 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1c150 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1c160 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1c170 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1c180 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1c190 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c1a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1c1b0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1c1c0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1c1d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1c1e0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1c1f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1c200 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1c210 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1c220 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1c230 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1c240 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1c250 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1c260 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1c270 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1c280 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1c290 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1c2a0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1c2b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1c2c0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1c2d0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1c2e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1c2f0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1c300 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1c310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1c320 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1c330 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1c340 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1c350 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1c360 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1c370 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1c380 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1c390 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c3a0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1c3b0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1c3c0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1c3d0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1c3e0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1c3f0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1c400 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1c410 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1c420 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1c430 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1c440 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1c450 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1c460 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1c470 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1c480 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1c490 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1c4a0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1c4b0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1c4c0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1c4d0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1c4e0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1c4f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1c500 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1c510 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1c520 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1c530 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1c540 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1c550 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1c560 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1c570 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1c580 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1c590 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1c5a0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1c5b0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1c5c0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1c5d0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1c5e0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1c5f0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1c600 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1c610 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1c620 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1c630 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1c640 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1c650 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1c660 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1c670 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1c680 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1c690 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1c6a0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1c6b0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1c6c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1c6d0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1c6e0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1c6f0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1c700 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1c710 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1c720 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1c730 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1c740 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1c750 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1c760 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1c770 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1c780 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1c790 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1c7a0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1c7b0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1c7c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1c7d0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1c7e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1c7f0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1c800 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1c810 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1c820 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1c830 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1c840 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1c850 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1c860 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1c870 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1c880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1c890 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1c8a0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1c8b0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1c8c0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1c8d0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1c8e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1c8f0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1c900 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1c910 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1c920 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1c930 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1c940 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1c950 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1c960 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1c970 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1c980 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1c990 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c9a0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1c9b0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1c9c0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1c9d0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1c9e0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1c9f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1ca00 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1ca10 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1ca20 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1ca30 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1ca40 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1ca50 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1ca60 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1ca70 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1ca80 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1ca90 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1caa0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1cab0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1cac0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1cad0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1cae0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1caf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cb00 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1cb10 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1cb20 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1cb30 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1cb40 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1cb50 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1cb60 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1cb70 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1cb80 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1cb90 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1cba0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1cbb0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1cbc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1cbd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1cbe0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1cbf0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1cc00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1cc10 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1cc20 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1cc30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1cc40 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1cc50 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1cc60 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1cc70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1cc80 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1cc90 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1cca0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ccb0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1ccc0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ccd0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1cce0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ccf0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1cd00 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1cd10 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1cd20 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1cd30 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1cd40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1cd50 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1cd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1cd70 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1cd80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cd90 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
1cda0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1cdb0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1cdc0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1cdd0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1cde0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1cdf0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1ce00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ce10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1ce30 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1ce40 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1ce50 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ce60 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1ce70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ce80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ce90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1cea0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ceb0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1cec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ced0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1cee0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1cef0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1cf00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1cf10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1cf20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cf30 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1cf40 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1cf50 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1cf60 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1cf70 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1cf80 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
1cf90 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1cfa0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
1cfb0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1cfc0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1cfd0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1cfe0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1cff0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1d000 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1d010 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1d020 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1d030 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1d040 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1d050 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1d060 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1d070 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1d080 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1d090 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1d0a0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1d0b0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1d0c0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1d0d0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1d0e0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1d0f0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1d100 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1d110 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1d120 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1d130 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1d140 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1d150 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1d160 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1d170 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1d180 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1d190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d1a0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1d1b0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1d1c0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1d1d0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1d1e0 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30  .  if( pBtree==0
1d1f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1d200 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d210 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1d220 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1d230 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1d240 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1d250 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1d260 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1d270 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1d280 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1d290 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1d2a0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1d2b0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1d2c0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1d2d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1d2e0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1d2f0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1d300 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1d310 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d320 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1d330 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1d340 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1d350 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1d360 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1d370 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1d380 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1d390 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1d3a0 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1d3b0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1d3c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1d3d0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1d3e0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1d3f0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1d400 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1d410 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1d420 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d430 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1d440 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1d450 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1d460 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1d470 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1d480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1d490 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1d4a0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
1d4b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1d4c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1d4d0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1d4e0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
1d4f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1d500 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
1d510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d520 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
1d530 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1d540 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  (pBt, 0, 0);.  }
1d550 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1d560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d570 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1d580 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d590 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
1d5a0 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d  , tripCode);.  }
1d5b0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1d5c0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1d5d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1d5e0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1d5f0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1d600 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1d610 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d620 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1d630 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1d640 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1d650 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1d660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d670 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1d680 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1d690 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1d6a0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1d6b0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1d6c0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1d6d0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1d6e0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1d6f0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1d700 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1d710 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1d720 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1d730 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d740 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1d750 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1d760 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1d770 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1d780 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1d790 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d7a0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1d7b0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1d7c0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1d7d0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1d7e0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1d7f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d800 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1d810 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1d820 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1d830 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d840 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1d850 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1d860 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1d870 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
1d880 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d890 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1d8a0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
1d8b0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
1d8c0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1d8d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1d8e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1d8f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1d900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
1d910 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
1d920 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1d930 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1d940 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1d950 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1d960 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1d970 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1d980 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1d990 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1d9a0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1d9b0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1d9c0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1d9d0 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1d9e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1d9f0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1da00 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1da10 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1da20 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1da30 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1da40 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1da50 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1da60 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1da70 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1da80 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1da90 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1daa0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1dab0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1dac0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1dad0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1dae0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1daf0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1db00 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1db10 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1db20 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1db30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1db40 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1db50 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1db60 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1db70 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1db80 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1db90 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1dba0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1dbb0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1dbc0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1dbd0 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1dbe0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1dbf0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1dc00 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1dc10 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1dc20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1dc30 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1dc40 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1dc50 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1dc60 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1dc70 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1dc80 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1dc90 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1dca0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1dcb0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1dcc0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1dcd0 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1dce0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1dcf0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1dd00 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1dd10 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1dd20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1dd30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1dd40 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1dd50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1dd60 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1dd70 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1dd80 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
1dd90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1dda0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
1ddb0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1ddc0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1ddd0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1dde0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1ddf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1de00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1de10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1de20 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1de30 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1de40 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1de50 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1de60 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1de70 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1de80 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1de90 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1dea0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1deb0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1dec0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1ded0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1dee0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1def0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1df00 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1df10 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1df20 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1df30 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1df40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1df50 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1df60 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1df70 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1df80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1df90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dfa0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1dfb0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1dfc0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1dfd0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1dfe0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1dff0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1e000 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1e010 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1e020 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1e030 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1e040 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1e050 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1e060 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1e070 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1e080 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1e090 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1e0a0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1e0b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1e0c0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1e0d0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1e0e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1e0f0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1e100 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1e110 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1e120 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1e130 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1e140 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1e150 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1e160 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1e170 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1e180 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1e190 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1e1a0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1e1b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1e1c0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1e1d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e1e0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1e1f0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1e200 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1e210 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e220 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1e230 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1e240 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1e250 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e260 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1e270 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1e280 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1e290 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1e2a0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1e2b0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1e2c0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1e2d0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1e2e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1e2f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e300 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1e310 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1e320 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1e330 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1e340 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1e350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e360 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1e370 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
1e380 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
1e390 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
1e3a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
1e3b0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1e3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1e3d0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1e3e0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1e3f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1e400 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
1e410 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
1e420 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1e430 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
1e440 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
1e450 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
1e460 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
1e470 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1e480 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
1e490 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
1e4a0 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
1e4b0 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
1e4c0 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
1e4d0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
1e4e0 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
1e4f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1e500 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1e510 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e520 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
1e530 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
1e540 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
1e550 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
1e560 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
1e570 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
1e580 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
1e590 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1e5a0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
1e5b0 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
1e5c0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1e5d0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
1e5e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e5f0 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
1e600 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
1e610 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
1e620 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1e630 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
1e640 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1e650 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1e660 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
1e670 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1e680 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1e690 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
1e6a0 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
1e6b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1e6c0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
1e6d0 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
1e6e0 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
1e6f0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
1e700 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
1e710 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
1e720 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
1e730 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
1e740 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
1e750 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
1e760 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
1e770 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
1e780 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1e790 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
1e7a0 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
1e7b0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1e7c0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
1e7d0 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1e7e0 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
1e7f0 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
1e800 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
1e810 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
1e820 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
1e830 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
1e840 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
1e850 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
1e860 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
1e870 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
1e880 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
1e890 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
1e8a0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
1e8b0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
1e8c0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
1e8d0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1e8e0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1e8f0 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
1e900 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
1e910 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
1e920 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
1e930 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
1e940 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
1e950 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1e960 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
1e970 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
1e980 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
1e990 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
1e9a0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
1e9b0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
1e9c0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
1e9d0 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
1e9e0 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
1e9f0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
1ea00 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
1ea10 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
1ea20 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1ea30 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
1ea40 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
1ea50 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
1ea60 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
1ea70 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1ea80 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1ea90 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1eaa0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1eab0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1eae0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1eb10 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1eb20 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1eb30 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1eb60 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1eb70 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1eb80 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1eba0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1ebb0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1ebc0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1ebd0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ebf0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1ec00 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1ec10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ec20 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1ec30 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1ec40 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1ec50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ec60 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1ec70 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1ec80 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1ec90 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1eca0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1ecb0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1ecc0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1ecd0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1ece0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1ecf0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1ed00 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1ed10 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1ed20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1ed30 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1ed40 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ed50 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1ed60 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1ed70 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1ed80 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1ed90 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1eda0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1edb0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1edc0 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1edd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1ede0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1edf0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1ee00 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1ee10 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1ee20 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1ee30 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1ee40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1ee50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1ee60 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1ee70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1ee80 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1ee90 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1eea0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1eeb0 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1eec0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1eed0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1eee0 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d  (wrFlag && (pBt-
1eef0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1ef00 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29  READ_ONLY)!=0) )
1ef10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ef20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1ef30 7d 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  }.  if( wrFlag )
1ef40 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
1ef50 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1ef60 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
1ef70 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
1ef80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ef90 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1efa0 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
1efb0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1efc0 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
1efd0 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
1efe0 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
1eff0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1f000 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1f010 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1f020 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1f030 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1f040 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1f050 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1f060 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1f070 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1f080 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1f090 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1f0a0 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1f0b0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1f0c0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1f0d0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1f0e0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1f0f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1f100 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43  0 || wrFlag==BTC
1f110 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20  F_WriteFlag );. 
1f120 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
1f130 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
1f140 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1f150 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
1f160 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1f170 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1f180 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
1f190 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1f1a0 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
1f1b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1f1c0 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e  NVALID;.  return
1f1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1f1e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1f1f0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1f200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1f230 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1f240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1f270 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1f280 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1f2c0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1f2d0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1f2e0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f300 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
1f310 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
1f320 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1f350 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
1f360 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1f370 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1f380 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1f390 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
1f3a0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
1f3b0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
1f3c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1f3d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1f3e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1f3f0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1f400 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
1f410 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
1f420 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
1f430 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
1f440 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
1f450 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
1f460 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
1f470 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
1f480 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
1f490 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
1f4a0 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
1f4b0 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
1f4c0 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
1f4d0 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
1f4e0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
1f4f0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
1f500 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
1f510 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1f520 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
1f530 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
1f540 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
1f550 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1f560 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
1f570 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
1f580 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
1f590 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
1f5a0 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
1f5b0 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
1f5c0 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
1f5d0 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
1f5e0 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
1f5f0 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
1f600 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
1f610 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
1f620 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
1f630 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
1f640 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
1f650 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
1f660 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
1f670 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
1f680 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1f690 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
1f6a0 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
1f6b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f6c0 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
1f6d0 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
1f6e0 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
1f6f0 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
1f700 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1f710 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1f720 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1f730 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1f740 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1f750 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1f760 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1f770 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1f780 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1f790 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1f7a0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1f7b0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1f7c0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1f7d0 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1f7e0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1f7f0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1f800 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1f810 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1f820 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1f830 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1f840 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1f850 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1f860 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1f870 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1f880 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1f890 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1f8a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1f8b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1f8c0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1f8d0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1f8e0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1f8f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1f900 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1f910 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1f920 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1f930 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1f940 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1f950 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
1f960 69 74 65 33 44 62 46 72 65 65 28 70 42 74 72 65  ite3DbFree(pBtre
1f970 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76  e->db, pCur->aOv
1f980 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
1f990 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
1f9a0 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
1f9b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1f9c0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
1f9d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f9e0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1f9f0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
1fa00 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
1fa10 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
1fa20 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1fa30 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
1fa40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1fa50 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
1fa60 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
1fa70 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
1fa80 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
1fa90 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
1faa0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
1fab0 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
1fac0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
1fad0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
1fae0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
1faf0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
1fb00 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
1fb10 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
1fb20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
1fb30 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
1fb40 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
1fb50 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
1fb60 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
1fb70 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
1fb80 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1fb90 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
1fba0 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
1fbb0 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
1fbc0 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
1fbd0 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
1fbe0 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
1fbf0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
1fc00 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
1fc10 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
1fc20 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
1fc30 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
1fc40 67 20 61 67 67 72 65 73 73 69 76 65 20 69 6e 6c  g aggressive inl
1fc50 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1fc60 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1fc70 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1fc80 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1fc90 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1fca0 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1fcb0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1fcc0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1fcd0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1fce0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1fcf0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1fd00 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1fd10 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1fd20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1fd30 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1fd40 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1fd50 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1fd60 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1fd70 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1fd80 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1fd90 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1fda0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1fdb0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1fdc0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1fdd0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1fde0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1fdf0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1fe00 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1fe10 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1fe20 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1fe30 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1fe40 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1fe50 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1fe60 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1fe70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1fe80 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1fe90 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1fea0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1feb0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1fec0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
1fed0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1fee0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1fef0 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1ff00 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
1ff10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
1ff20 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
1ff30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ff40 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1ff50 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1ff60 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1ff70 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1ff80 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1ff90 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1ffa0 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1ffb0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1ffc0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1ffd0 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1ffe0 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20010 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
20020 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
20030 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
20070 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
20080 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
200c0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
200d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
200e0 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
200f0 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
20100 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20  fo);        \.  
20110 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
20120 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
20130 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
20160 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
201b0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
201c0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20200 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
20210 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e  MSC_VER */..#ifn
20220 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
20230 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
20240 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
20250 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
20260 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
20270 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
20280 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
20290 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
202a0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
202b0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
202c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
202d0 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
202e0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
202f0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
20300 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
20310 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
20320 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
20330 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
20340 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
20350 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
20360 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
20370 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
20380 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20390 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
203a0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
203b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
203c0 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
203d0 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
203e0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
203f0 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
20400 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
20410 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
20420 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
20430 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
20440 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
20450 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
20460 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
20470 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
20480 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
20490 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
204a0 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
204b0 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
204c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
204d0 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
204e0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
204f0 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
20500 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
20510 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
20520 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
20530 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
20540 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
20550 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
20560 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
20570 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
20580 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
20590 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
205a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
205b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
205c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
205d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
205e0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
205f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20600 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
20610 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
20620 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
20630 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
20640 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65  }else{.    getCe
20650 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
20660 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
20670 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
20680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20690 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
206a0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
206b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
206c0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
206d0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
206e0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
206f0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
20700 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
20710 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
20720 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
20730 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
20740 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
20750 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
20760 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
20770 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
20780 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
20790 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
207a0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
207b0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
207c0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
207d0 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
207e0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
207f0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
20800 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
20810 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
20820 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
20830 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
20840 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
20850 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
20860 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
20870 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
20880 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
20890 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
208a0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
208b0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
208c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
208d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
208e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
208f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20900 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
20910 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
20920 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20930 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20  ->intKeyLeaf==1 
20940 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
20950 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
20960 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50   = pCur->info.nP
20970 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
20980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20990 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
209a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
209b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
209c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
209d0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
209e0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
209f0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
20a00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
20a10 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
20a20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
20a30 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
20a40 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
20a50 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
20a60 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
20a70 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
20a80 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
20a90 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
20aa0 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
20ab0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
20ac0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
20ad0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20ae0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
20af0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
20b00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
20b10 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
20b20 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
20b30 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
20b40 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
20b50 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
20b60 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
20b70 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
20b80 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
20b90 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
20ba0 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
20bb0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
20bc0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
20bd0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
20be0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
20bf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
20c00 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
20c10 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
20c20 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
20c30 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
20c40 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
20c50 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
20c60 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
20c70 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
20c80 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
20c90 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
20ca0 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
20cb0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
20cc0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
20cd0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
20ce0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
20cf0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
20d00 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
20d10 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
20d20 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
20d30 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
20d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
20d50 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
20d60 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d80 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
20d90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
20da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20db0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
20dc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
20dd0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
20de0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
20df0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
20e00 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
20e10 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
20e20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e40 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
20e50 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
20e60 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
20e70 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
20e80 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
20e90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20ea0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
20eb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
20ec0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
20ed0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
20ee0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
20ef0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20f00 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
20f10 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
20f20 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
20f30 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
20f40 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
20f50 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
20f60 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
20f70 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
20f80 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
20f90 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
20fa0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
20fb0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
20fc0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
20fd0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
20fe0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
20ff0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
21000 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
21010 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
21020 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
21030 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
21040 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
21050 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
21060 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
21070 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
21080 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
21090 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
210a0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
210b0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
210c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
210d0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
210e0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
210f0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
21100 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
21110 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
21120 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
21130 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
21140 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
21150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21160 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
21170 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
21180 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
21190 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
211a0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
211b0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
211c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
211d0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
211e0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
211f0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21200 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21210 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
21220 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
21230 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
21240 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
21250 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
21260 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
21270 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
21280 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
21290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
212a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
212b0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
212c0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
212d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
212e0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
212f0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
21300 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
21310 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
21320 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
21330 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
21340 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
21350 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
21360 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
21370 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
21380 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
21390 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
213a0 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
213b0 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
213c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
213d0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
213e0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
213f0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
21400 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
21410 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
21420 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
21430 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
21440 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
21450 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
21460 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
21470 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
21480 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21490 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
214a0 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
214b0 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
214c0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
214d0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
214e0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
214f0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
21500 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
21510 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
21520 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
21530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
21540 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
21550 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
21560 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
21570 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
21580 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
215b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
215c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
215d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
215e0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
215f0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
21600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
21610 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
21620 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
21630 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
21640 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
21650 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
21660 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
21670 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
21680 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
21690 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
216a0 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
216b0 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
216c0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
216d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
216e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
216f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21700 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
21710 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
21720 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
21730 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
21740 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
21750 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
21760 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
21770 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
21780 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
21790 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
217a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
217b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
217c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
217d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
217e0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
217f0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
21800 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
21810 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
21820 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
21830 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
21840 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
21850 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
21860 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
21870 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
21880 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
21890 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
218a0 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
218b0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
218c0 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
218d0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
218e0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20   cache..**   2: 
218f0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
21900 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20   a read. Do not 
21910 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
21920 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
21930 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
21940 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
21950 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
21960 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
21970 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
21980 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
21990 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
219a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
219b0 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
219c0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
219d0 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
219e0 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
219f0 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
21a00 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
21a10 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
21a20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
21a30 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
21a40 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
21a50 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20  rflow pages and 
21a60 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d  the.** eOp argum
21a70 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68  ent is not 2, th
21a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
21a90 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
21aa0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a  or and lazily .*
21ab0 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20  * populates the 
21ac0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
21ad0 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28  st cache array (
21ae0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
21af0 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75  ow). .** Subsequ
21b00 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
21b10 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  is cache to make
21b20 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
21b30 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
21b40 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65  .** more efficie
21b50 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
21b60 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
21b70 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
21b80 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
21b90 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
21ba0 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
21bb0 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
21bc0 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
21bd0 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
21be0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
21bf0 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
21c00 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
21c10 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
21c20 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
21c30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
21c40 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
21c50 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
21c60 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
21c70 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
21c80 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
21c90 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
21ca0 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
21cb0 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
21cc0 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
21cd0 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
21ce0 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
21cf0 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
21d00 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
21d10 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
21d20 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
21d30 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
21d40 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
21d50 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
21d60 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
21d70 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
21d80 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
21d90 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
21da0 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
21db0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
21dc0 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
21dd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
21de0 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
21df0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
21e00 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
21e10 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
21e20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
21e30 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
21e40 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
21e50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
21e60 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
21e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21e80 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
21e90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
21ea0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21eb0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
21ec0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
21ed0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
21ee0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21ef0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f10 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
21f20 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
21f30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
21f40 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
21f50 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
21f60 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
21f70 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69  tart = pBuf;.  i
21f80 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20  nt bEnd;        
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
21fb0 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65   if reading to e
21fc0 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65  nd of data */.#e
21fd0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
21fe0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
21ff0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
22000 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
22010 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22020 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22030 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
22040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
22050 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22060 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22070 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73  ( eOp!=2 || offs
22080 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41  et==0 );    /* A
22090 6c 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d  lways start from
220a0 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65   beginning for e
220b0 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43  Op==2 */..  getC
220c0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
220d0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
220e0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
220f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22100 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
22110 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66  EAD.  bEnd = off
22120 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69  set+amt==pCur->i
22130 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65  nfo.nPayload;.#e
22140 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f  ndif.  assert( o
22150 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75  ffset+amt <= pCu
22160 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
22170 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79   );..  if( &aPay
22180 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
22190 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
221a0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
221b0 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  bleSize] ){.    
221c0 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
221d0 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
221e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
221f0 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ata is an error 
22200 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
22210 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22220 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
22230 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
22240 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
22250 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
22260 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
22270 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
22280 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22290 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
222a0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
222b0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
222c0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
222d0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
222e0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
222f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
22300 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
22310 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
22320 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30  Buf, a, (eOp & 0
22330 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62  x01), pPage->pDb
22340 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
22350 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
22360 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
22370 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
22380 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
22390 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
223a0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
223b0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
223c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
223d0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
223e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
223f0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
22400 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
22410 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
22420 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
22430 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
22440 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
22450 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
22460 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
22470 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
22480 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
22490 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
224a0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
224b0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
224c0 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
224d0 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
224e0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
224f0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
22500 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
22510 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
22520 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
22530 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
22540 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
22550 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
22560 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
22570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
22580 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
22590 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
225a0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
225b0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
225c0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
225d0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
225e0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
225f0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
22600 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
22610 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
22620 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
22630 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
22640 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
22650 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
22660 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
22670 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
22680 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
22690 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
226a0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
226b0 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
226c0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
226d0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44   (Pgno*)sqlite3D
226e0 62 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  bRealloc(.      
226f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72        pCur->pBtr
22700 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f  ee->db, pCur->aO
22710 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
22720 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
22730 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
22740 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
22750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22760 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22780 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66        pCur->nOvf
22790 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32  lAlloc = nOvfl*2
227a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
227b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e  ->aOverflow = aN
227c0 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
227d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
227e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
227f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
22800 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
22810 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66   0, nOvfl*sizeof
22820 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  (Pgno));.       
22830 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22840 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
22850 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
22860 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
22870 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
22880 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
22890 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
228a0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
228b0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
228c0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
228d0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
228e0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
228f0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
22900 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
22910 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
22920 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a  F_ValidOvfl)!=0.
22930 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f       && pCur->aO
22940 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
22950 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a  vflSize].    ){.
22960 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
22970 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
22980 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
22990 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
229a0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
229b0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
229c0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
229d0 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
229e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
229f0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
22a00 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20  iIdx++){..      
22a10 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
22a20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
22a30 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
22a40 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
22a50 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
22a60 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
22a70 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)!=0 ){.    
22a80 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
22a90 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
22aa0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
22ab0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
22ac0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
22ad0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
22ae0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
22af0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
22b00 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
22b10 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22b20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
22b30 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
22b40 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
22b50 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
22b60 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
22b70 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
22b80 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
22b90 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
22ba0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
22bb0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
22bc0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
22bd0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
22be0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
22bf0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
22c00 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
22c10 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
22c20 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
22c30 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
22c40 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
22c50 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
22c60 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
22c70 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
22c80 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
22c90 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
22ca0 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
22cb0 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
22cc0 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
22cd0 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
22ce0 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
22cf0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
22d00 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
22d10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
22d20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
22d30 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
22d40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
22d50 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
22d60 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
22d70 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
22d80 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
22d90 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
22da0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
22db0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
22dc0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
22dd0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
22de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22df0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
22e00 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
22e10 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
22e20 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
22e30 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
22e40 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
22e50 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
22e60 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
22e70 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
22e80 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
22e90 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
22ea0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
22eb0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
22ec0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
22ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22ee0 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
22ef0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
22f00 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
22f10 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
22f20 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
22f30 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
22f40 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
22f50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22f60 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
22f70 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
22f80 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
22f90 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
22fa0 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
22fb0 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
22fc0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
22fd0 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
22fe0 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
22ff0 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
23000 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
23010 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
23020 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
23030 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
23040 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
23050 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
23060 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
23070 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
23080 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
23090 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
230a0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
230b0 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
230c0 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
230d0 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
230e0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
230f0 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
23100 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c      **   7) at l
23110 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
23120 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
23130 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
23140 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
23150 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
23160 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
23170 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
23180 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
23190 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
231a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
231b0 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
231c0 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
231d0 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
231e0 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
231f0 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
23200 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
23210 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
23220 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
23230 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
23240 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
23250 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23270 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
23280 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
23290 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
232d0 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
232e0 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
23310 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
23320 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
23330 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
23360 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
23370 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
23380 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
23390 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
233a0 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
233b0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
233c0 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
233f0 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
23400 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23430 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (7) */.       
23440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
23450 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
23460 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
23470 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
23480 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
23490 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
234a0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
234c0 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20  ence (7) */.    
234d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
234e0 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
234f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
23500 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
23510 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
23520 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
23530 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
23540 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
23550 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
23560 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
23570 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
23580 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
23590 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
235a0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
235b0 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
235c0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
235d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
235e0 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
235f0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
23600 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
23610 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
23620 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
23630 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
23640 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
23650 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23670 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
23680 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
23690 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
236a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
236b0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
236c0 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
236d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
236e0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
236f0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
23700 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
23710 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
23720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23730 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
23740 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
23750 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
23760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23770 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
23780 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
23790 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
237a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
237b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
237c0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
237d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
237e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
237f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23800 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
23810 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
23820 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
23830 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
23840 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
23850 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
23860 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
23870 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
23880 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
23890 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
238a0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
238b0 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
238c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
238d0 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
238e0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
238f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
23900 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
23910 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
23920 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
23930 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
23940 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
23950 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
23960 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
23970 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
23980 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
23990 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
239a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
239b0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
239c0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
239d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
239e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
239f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23a00 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23a10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23a20 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23a30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
23a40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23a60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23a70 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23a80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23a90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
23aa0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
23ab0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
23ac0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
23ad0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
23ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
23af0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
23b00 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
23b10 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
23b20 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
23b30 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
23b40 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
23b50 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
23b60 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
23b70 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
23b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
23b90 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
23ba0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
23bb0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
23bc0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
23bd0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
23be0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
23bf0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
23c00 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
23c10 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
23c20 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
23c30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
23c40 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
23c50 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
23c60 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
23c70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
23c80 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
23c90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23ca0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
23cb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23cc0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
23cd0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
23ce0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23cf0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
23d00 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
23d10 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
23d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23d30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
23d40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23d50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
23d60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23d70 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
23d80 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23d90 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
23da0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
23db0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
23dc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23dd0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
23de0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
23df0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
23e00 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
23e10 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
23e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23e30 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23e40 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
23e50 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
23e60 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
23e70 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
23e80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
23e90 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
23ea0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
23eb0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
23ec0 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
23ed0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
23ee0 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
23ef0 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
23f00 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
23f10 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
23f20 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
23f30 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
23f40 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
23f50 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
23f60 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
23f70 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
23f80 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
23f90 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
23fa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
23fb0 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
23fc0 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
23fd0 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
23fe0 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
23ff0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
24000 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
24010 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
24020 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
24030 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
24040 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
24050 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
24060 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
24070 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
24080 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
24090 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
240a0 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
240b0 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
240c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
240d0 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
240e0 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
240f0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
24100 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
24110 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
24120 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
24130 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
24140 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
24150 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
24160 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
24170 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
24180 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
24190 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
241a0 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
241b0 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
241c0 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
241d0 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
241e0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
241f0 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
24200 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
24210 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
24220 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
24230 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
24240 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
24250 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
24260 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
24270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
24280 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
24290 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
242a0 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
242b0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
242c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
242d0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
242e0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
242f0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24310 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24320 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
24330 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
24340 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24350 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24370 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24380 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
24390 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
243a0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
243b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
243c0 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d  e>0 );.  *pAmt =
243d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
243e0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  al;.  return (vo
243f0 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
24400 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
24410 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
24420 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
24430 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
24440 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
24450 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
24460 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
24470 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
24480 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
24490 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
244a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
244b0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
244c0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
244d0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
244e0 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
244f0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
24500 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
24510 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
24520 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
24530 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
24540 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
24550 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
24560 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
24570 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
24580 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
24590 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
245a0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
245b0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
245c0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
245d0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
245e0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
245f0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
24600 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
24610 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
24620 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
24630 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
24640 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
24650 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
24660 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
24670 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
24680 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
24690 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
246a0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
246b0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
246c0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
246d0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
246e0 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
246f0 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
24700 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
24710 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
24720 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
24730 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
24740 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
24750 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
24760 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
24770 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
24780 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
24790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
247a0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
247b0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
247c0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
247d0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
247e0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
247f0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
24800 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
24810 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
24820 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
24830 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
24840 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
24850 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
24860 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
24870 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
24880 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
24890 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
248a0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
248b0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
248c0 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
248d0 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
248e0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
248f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
24900 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
24910 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24920 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24940 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24950 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
24960 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
24970 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
24980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24990 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
249a0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
249b0 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
249c0 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
249d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
249e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
249f0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
24a00 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
24a10 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20  o, &pNewPage,.  
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
24a30 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
24a40 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
24a50 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
24a60 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69  ADONLY : 0);.  i
24a70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
24a80 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
24a90 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
24aa0 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
24ab0 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
24ac0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
24ad0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24ae0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
24af0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
24b00 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
24b10 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
24b20 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
24b30 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
24b40 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
24b50 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
24b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
24b70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24b80 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
24b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
24ba0 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  f 0./*.** Page p
24bb0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
24bc0 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
24bd0 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
24be0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
24bf0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
24c00 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
24c10 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
24c20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
24c30 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
24c40 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
24c50 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
24c60 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
24c70 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
24c80 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
24c90 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
24ca0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
24cb0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
24cc0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
24cd0 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
24ce0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
24cf0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
24d00 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
24d10 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
24d20 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
24d30 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
24d40 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
24d50 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
24d60 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
24d70 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
24d80 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
24d90 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
24da0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
24db0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24dc0 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
24dd0 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
24de0 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
24df0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
24e00 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
24e10 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
24e20 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
24e30 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
24e40 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
24e50 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
24e60 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
24e70 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
24e80 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
24e90 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
24ea0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
24eb0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
24ec0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
24ed0 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
24ee0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
24ef0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
24f00 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
24f10 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
24f20 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
24f30 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
24f40 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24f50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24f60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24f70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24f80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24fa0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
24fb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24fc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24fd0 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45   );..  /* UPDATE
24fe0 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79  : It is actually
24ff0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
25000 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74  e condition test
25010 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  ed by the assert
25020 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62  .  ** below to b
25030 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20  e untrue if the 
25040 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
25050 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63   corrupt. This c
25060 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a  an occur if.  **
25070 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20   one cursor has 
25080 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50  modified page pP
25090 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65  arent while a re
250a0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73  ference to it is
250b0 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61   held .  ** by a
250c0 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20   second cursor. 
250d0 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  Which can only h
250e0 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c  appen if a singl
250f0 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64  e page is linked
25100 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20  .  ** into more 
25110 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
25120 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63  structure in a c
25130 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
25140 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73    */.#if 0.  ass
25150 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
25160 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
25170 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
25180 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
25190 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
251a0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
251b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
251c0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64  ->pgno.  );.#end
251d0 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  if.  testcase( p
251e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
251f0 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
25200 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25210 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
25220 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
25230 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
25240 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
25250 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
25260 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25270 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
25280 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
25290 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
252a0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f  ValidOvfl);.}../
252b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
252c0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
252d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
252e0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
252f0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
25300 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
25310 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
25320 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
25330 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
25340 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
25350 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
25360 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
25370 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
25380 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
25390 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
253a0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
253b0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
253c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
253d0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
253e0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
253f0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
25400 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
25410 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
25420 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
25430 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
25440 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
25450 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
25460 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
25470 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
25480 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
25490 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
254a0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
254b0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
254c0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
254d0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
254e0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
254f0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
25500 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
25510 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
25520 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
25530 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
25540 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
25550 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
25560 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
25570 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
25580 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
25590 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
255a0 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
255b0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
255c0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
255d0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
255e0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
255f0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
25600 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
25610 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
25620 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
25630 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
25640 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
25650 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
25660 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
25670 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
25680 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
25690 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
256a0 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
256b0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
256c0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
256d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
256e0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
256f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
25700 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
25710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25720 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
25730 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25740 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25750 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
25760 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
25770 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
25780 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
25790 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
257a0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
257b0 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
257c0 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
257d0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
257e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
257f0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
25800 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
25810 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25820 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
25830 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
25840 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
25850 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
25860 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
25870 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
25880 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
25890 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
258a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
258b0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
258c0 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
258d0 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43  ) releasePage(pC
258e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
258f0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65  >iPage--]);.  }e
25900 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
25910 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
25920 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
25930 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
25940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25950 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
25960 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
25970 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
25980 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
25990 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
259a0 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
259c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
259d0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
259e0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
259f0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
25a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25a10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
25a20 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
25a30 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
25a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25a50 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
25a60 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f  e = 0;.  }.  pRo
25a70 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
25a80 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
25a90 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
25aa0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
25ab0 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
25ac0 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
25ad0 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
25ae0 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
25af0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
25b00 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
25b10 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
25b20 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
25b30 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
25b40 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
25b50 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
25b60 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
25b70 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
25b80 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
25b90 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
25ba0 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
25bb0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
25bc0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
25bd0 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
25be0 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
25bf0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
25c00 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
25c10 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
25c20 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
25c30 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
25c40 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
25c50 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
25c60 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
25c70 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
25c80 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
25c90 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
25ca0 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
25cb0 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
25cc0 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
25cd0 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
25ce0 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
25cf0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
25d00 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
25d10 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
25d20 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
25d30 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
25d40 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
25d50 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
25d60 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
25d70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25d80 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25d90 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
25da0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
25db0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
25dc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
25dd0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
25de0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
25df0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
25e00 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
25e10 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
25e20 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
25e30 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
25e40 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
25e50 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
25e60 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
25e70 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
25e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25e90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
25ea0 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
25eb0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
25ec0 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
25ed0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
25ee0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25ef0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
25f00 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
25f10 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
25f20 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
25f30 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
25f40 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
25f50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25f60 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
25f70 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
25f80 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
25f90 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
25fa0 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
25fb0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
25fc0 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
25fd0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
25fe0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
25ff0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
26000 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
26010 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
26020 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
26030 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
26040 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
26050 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
26060 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
26070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
26080 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
26090 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
260a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
260b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
260c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
260d0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
260e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
260f0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
26100 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26110 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
26120 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26130 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26140 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
26150 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
26160 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
26170 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
26180 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26190 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
261a0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
261b0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
261c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
261d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
261e0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
261f0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
26200 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
26210 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
26220 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
26230 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
26240 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
26250 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
26260 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
26270 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
26280 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
26290 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
262a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
262b0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
262c0 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
262d0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
262e0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
262f0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
26300 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
26310 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
26320 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
26330 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
26340 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
26350 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
26360 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
26370 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
26380 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
26390 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
263a0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
263b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
263c0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
263d0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
263e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
263f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26400 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26410 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26420 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
26430 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
26440 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26450 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
26460 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
26470 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26480 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
26490 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
264a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
264b0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
264c0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
264d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
264e0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
264f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26500 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
26510 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
26520 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
26530 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26540 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
26550 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
26560 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26570 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
26580 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26590 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
265a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
265b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
265c0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
265d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
265e0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
265f0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
26600 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
26610 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
26620 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
26630 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
26640 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
26650 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
26660 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
26670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
26680 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
26690 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
266a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
266b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
266c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
266d0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
266e0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
266f0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
26700 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
26710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26720 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
26730 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26740 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
26750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26760 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
26770 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26780 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
26790 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
267a0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
267b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
267c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
267d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
267e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
267f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
26800 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
26810 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
26820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26830 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
26840 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
26850 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
26860 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
26870 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
26880 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
26890 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
268a0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
268b0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
268c0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
268d0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
268e0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
268f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
26900 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
26910 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
26920 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
26930 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26940 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26950 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26960 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
26970 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
26980 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
26990 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
269a0 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
269b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
269c0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
269d0 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
269e0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
269f0 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75  ate && (pCur->cu
26a00 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
26a10 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64  Last)!=0 ){.#ifd
26a20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
26a30 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
26a40 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65  k serves to asse
26a50 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75  rt() that the cu
26a60 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  rsor really does
26a70 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74   point .    ** t
26a80 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
26a90 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20   in the b-tree. 
26aa0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
26ab0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
26ac0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b  pCur->iPage; ii+
26ad0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
26ae0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69  ( pCur->aiIdx[ii
26af0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
26b00 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ii]->nCell );.  
26b10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
26b20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26b30 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e  ->iPage]==pCur->
26b40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26b50 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  ge]->nCell-1 );.
26b60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26b70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26b80 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23  Page]->leaf );.#
26b90 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
26ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26bb0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
26bc0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
26bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26be0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
26bf0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
26c00 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
26c10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
26c20 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
26c30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26c40 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
26c50 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
26c60 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
26c70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26c80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26c90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
26ca0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26cb0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
26cc0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
26cd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26cf0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
26d00 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
26d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26d20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26d30 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c  ags &= ~BTCF_AtL
26d40 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ast;.      }.   
26d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
26d60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
26d70 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f  ve the cursor so
26d80 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
26d90 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72  to an entry near
26da0 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65   the key .** spe
26db0 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65  cified by pIdxKe
26dc0 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52  y or intKey.   R
26dd0 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
26de0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
26df0 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74  INTKEY tables, t
26e00 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65  he intKey parame
26e10 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49  ter is used.  pI
26e20 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62  dxKey .** must b
26e30 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64  e NULL.  For ind
26e40 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b  ex tables, pIdxK
26e50 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69  ey is used and i
26e60 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  ntKey.** is igno
26e70 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
26e80 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
26e90 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
26ea0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
26eb0 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
26ec0 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
26ed0 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
26ee0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
26ef0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
26f00 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
26f10 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
26f20 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
26f30 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
26f40 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
26f50 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67  ..**.** An integ
26f60 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  er is written in
26f70 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69  to *pRes which i
26f80 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  s the result of.
26f90 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  ** comparing the
26fa0 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e   key with the en
26fb0 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65  try to which the
26fc0 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70   cursor is .** p
26fd0 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65  ointing.  The me
26fe0 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74  aning of the int
26ff0 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  eger written int
27000 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73  o.** *pRes is as
27010 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27020 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20      *pRes<0     
27030 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
27040 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
27050 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
27060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27070 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61    is smaller tha
27080 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
27090 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
270a0 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
270c0 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
270d0 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
270e0 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
270f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
27100 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
27110 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
27120 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
27130 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
27140 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
27150 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f   matches intKey/
27160 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  pIdxKey..**.**  
27170 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
27180 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
27190 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
271a0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
271d0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
271e0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
271f0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
27200 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
27210 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
27220 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
27230 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
27240 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
27250 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
27260 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
27270 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27290 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
272a0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
272b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
272c0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
272d0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
272e0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
272f0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
27300 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
27310 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
27320 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
27330 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
27340 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
27350 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
27360 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
27370 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27380 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27390 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
273a0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
273b0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
273c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
273d0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
273e0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
273f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
27400 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
27410 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
27420 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
27430 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
27440 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
27450 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
27460 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
27470 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  */.  if( pCur->e
27480 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27490 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
274a0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
274b0 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26  lidNKey)!=0.   &
274c0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
274d0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
274e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
274f0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
27500 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
27510 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
27520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27530 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
27540 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27550 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
27560 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
27570 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
27580 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
27590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
275b0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
275c0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
275d0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
275e0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
275f0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
27600 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
27610 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
27620 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
27630 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
27640 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
27650 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
27660 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
27670 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
27680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
27690 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
276a0 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
276b0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
276c0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
276d0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
276e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
276f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
27700 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
27710 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
27720 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27730 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
27740 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27750 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
27760 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27770 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
27780 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27790 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
277a0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
277b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
277c0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
277d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
277e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
277f0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
27800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
27810 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
27820 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
27830 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27840 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
27850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27860 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
27870 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
27880 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
27890 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
278a0 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
278b0 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
278c0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
278d0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
278e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
278f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
27900 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
27910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27920 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27930 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
27940 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
27950 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
27960 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
27970 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
27980 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
27990 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
279a0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
279b0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
279c0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
279d0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
279e0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
279f0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
27a00 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
27a10 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
27a20 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
27a30 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
27a40 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
27a50 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
27a60 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
27a70 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
27a80 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
27a90 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
27aa0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
27ab0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
27ac0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
27ad0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
27ae0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
27af0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
27b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27b10 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
27b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27b30 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
27b40 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
27b50 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
27b60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
27b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
27b80 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
27b90 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
27ba0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
27bb0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
27bc0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
27bd0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
27be0 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
27bf0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27c00 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
27c10 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
27c20 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
27c30 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
27c40 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
27c50 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
27c60 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
27c70 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
27c80 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
27c90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
27ca0 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
27cb0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
27cc0 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
27cd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
27ce0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
27cf0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
27d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
27d10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
27d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27d30 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
27d40 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
27d50 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
27d60 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
27d70 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
27d80 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
27d90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
27da0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
27db0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
27dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
27dd0 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
27de0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
27df0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
27e00 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
27e10 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
27e20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27e30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27e40 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
27e50 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
27e60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
27e70 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
27e80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
27e90 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
27ea0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
27eb0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27ec0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
27ed0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
27ee0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
27ef0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
27f00 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
27f10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
27f20 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
27f30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
27f50 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
27f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27f70 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
27f80 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27f90 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
27fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27fb0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
27fc0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
27fd0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
27fe0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
27ff0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
28000 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28010 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
28020 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
28030 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
28040 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
28050 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
28060 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a  >childPtrSize;..
28070 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
28080 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
28090 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
280a0 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
280b0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
280c0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
280d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
280e0 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
280f0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
28100 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
28110 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
28120 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
28130 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
28140 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
28150 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
28160 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
28170 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
28180 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
28190 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
281a0 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
281b0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
281c0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
281d0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
281e0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
281f0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
28200 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
28210 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
28220 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
28230 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
28240 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
28250 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
28260 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
28270 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
28280 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
28290 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
282a0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
282b0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
282c0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
282d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
282e0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
282f0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
28300 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
28310 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
28320 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
28330 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
28340 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
28350 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
28360 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
28370 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
28380 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
28390 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
283a0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
283b0 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
283c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
283d0 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
283e0 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
283f0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
28400 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
28410 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
28420 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
28430 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
28440 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
28450 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
28460 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
28470 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
28480 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
28490 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
284a0 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
284b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
284c0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
284d0 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
284e0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
284f0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
28500 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
28510 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
28520 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
28530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28540 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
28550 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
28560 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
28570 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
28580 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
28590 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
285a0 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
285b0 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
285c0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
285d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
285e0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
285f0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
28600 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
28610 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
28620 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
28630 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
28640 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
28650 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
28660 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
28670 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
28680 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
28690 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
286a0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
286b0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
286c0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
286d0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
286e0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
286f0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
28700 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
28710 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
28720 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
28730 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
28740 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
28750 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
28760 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28770 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
28780 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
28790 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
287a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
287b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
287c0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
287d0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
287e0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
287f0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
28800 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
28810 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
28820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
28830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
28840 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
28850 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
28860 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
28870 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
28880 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
28890 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
288a0 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
288b0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
288c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
288d0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
288e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
288f0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
28900 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
28910 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
28920 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
28930 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
28940 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
28950 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
28960 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
28970 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
28980 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28990 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
289a0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
289b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
289c0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
289d0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
289e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
289f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
28a00 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
28a10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28a20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
28a30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28a40 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
28a50 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
28a60 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
28a70 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
28a80 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
28a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
28aa0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
28ab0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
28ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28ad0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
28ae0 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
28af0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
28b00 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
28b10 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
28b20 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
28b30 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
28b40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
28b50 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
28b60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
28b70 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
28b80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
28b90 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
28ba0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
28bb0 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
28bc0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
28bd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
28be0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28bf0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
28c00 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
28c10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
28c20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
28c30 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
28c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28c50 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
28c60 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
28c70 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
28c80 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
28c90 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
28ca0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
28cb0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
28cc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
28cd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
28ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28cf0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
28d00 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
28d10 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
28d20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
28d30 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
28d40 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
28d50 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
28d60 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
28d70 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
28d80 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
28d90 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
28da0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28db0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28dc0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28dd0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28de0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28df0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
28e00 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
28e10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
28e20 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
28e30 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
28e40 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
28e50 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
28e60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
28e70 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
28e80 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
28e90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
28ea0 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
28eb0 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
28ec0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
28ed0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
28ee0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
28ef0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
28f00 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
28f10 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
28f20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28f30 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
28f40 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
28f50 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
28f60 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
28f70 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
28f80 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
28f90 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
28fa0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
28fb0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
28fc0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
28fd0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
28fe0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
28ff0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
29000 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
29010 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
29020 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
29030 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29040 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
29050 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
29060 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
29070 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
29080 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
29090 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
290a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
290b0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
290c0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
290d0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
290e0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
290f0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
29100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
29110 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
29120 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
29130 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
29140 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
29150 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
29160 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
29170 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
29180 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
29190 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
291a0 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
291b0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
291c0 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
291d0 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
291e0 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
291f0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
29200 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
29210 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
29220 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
29230 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
29240 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
29250 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
29260 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
29270 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
29280 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
29290 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
292a0 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
292b0 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
292c0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
292d0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
292e0 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
292f0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
29300 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
29310 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
29320 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
29330 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
29340 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
29350 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
29360 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
29370 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
29380 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
29390 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
293a0 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
293b0 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
293c0 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
293d0 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
293e0 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
293f0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
29400 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
29410 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
29420 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
29430 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
29440 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
29450 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
29460 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
29470 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
29480 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
29490 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
294a0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
294b0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
294c0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
294d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
294e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
294f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29510 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
29520 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
29530 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29540 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
29550 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
29560 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
29570 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
29580 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
29590 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
295a0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
295b0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
295c0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
295d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
295e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
295f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29600 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
29610 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
29620 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
29630 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
29640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29650 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
29660 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
29670 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
29680 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29690 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
296a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
296b0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
296c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
296d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
296e0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
296f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
29700 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
29710 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
29720 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
29740 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
29750 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
29760 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
29770 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29780 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
29790 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
297a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
297b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
297c0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
297d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
297e0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
297f0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
29800 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
29810 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
29820 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
29830 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
29840 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
29850 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
29860 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
29870 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
29880 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
29890 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
298a0 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
298b0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
298c0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
298d0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
298e0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
298f0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
29900 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
29910 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
29920 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
29930 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
29940 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
29950 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
29960 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
29970 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
29980 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
29990 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
299a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
299b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
299c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
299d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
299e0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
299f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
29a00 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
29a10 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
29a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
29a30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
29a40 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29a50 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
29a60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
29a80 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
29a90 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
29aa0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
29ab0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ac0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
29ad0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29ae0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
29af0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
29b00 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
29b10 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
29b20 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
29b30 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
29b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29b60 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
29b70 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
29b80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29b90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
29bb0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
29bc0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
29bd0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
29be0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
29bf0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
29c00 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
29c10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29c20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29c30 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
29c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
29c50 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
29c60 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
29c70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
29c80 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
29c90 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
29ca0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
29cb0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
29cc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
29cd0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
29ce0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
29cf0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
29d00 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29d10 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
29d20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
29d30 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
29d40 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
29d50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29d60 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
29d70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29d80 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
29d90 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
29da0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29db0 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
29dc0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
29dd0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
29de0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
29df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29e00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
29e10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
29e20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
29e30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
29e40 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
29e50 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
29e60 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
29e70 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
29e80 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
29e90 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
29ea0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
29eb0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
29ec0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
29ed0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29ee0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
29ef0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
29f00 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
29f10 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
29f20 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
29f30 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
29f40 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
29f50 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
29f60 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
29f70 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
29f80 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
29f90 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
29fa0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
29fb0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
29fc0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
29fd0 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
29fe0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
29ff0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2a000 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2a010 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2a020 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2a030 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2a040 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2a050 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2a060 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2a070 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2a080 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2a090 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2a0a0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2a0b0 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2a0c0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2a0d0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2a0e0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2a0f0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2a100 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2a110 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2a120 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2a130 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2a140 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2a150 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2a160 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2a170 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2a180 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2a190 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2a1a0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2a1b0 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2a1c0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2a1d0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2a1e0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2a1f0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2a200 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2a210 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2a220 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2a230 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2a240 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2a250 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2a260 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2a270 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2a280 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2a290 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2a2a0 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2a2b0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2a2c0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2a2d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2a2e0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2a2f0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2a300 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2a310 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2a320 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2a330 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2a340 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2a350 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a360 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2a370 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2a380 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2a390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2a3a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a3b0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2a3c0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2a3d0 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2a3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a3f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2a400 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2a410 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2a420 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2a430 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2a440 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2a450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2a470 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2a480 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2a490 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a4a0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2a4b0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2a4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a4d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2a4e0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2a4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a500 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a510 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2a520 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a530 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2a540 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a550 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2a560 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2a570 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2a580 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2a590 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2a5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a5b0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2a5c0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2a5d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2a5e0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2a5f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a600 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2a610 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2a620 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2a630 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2a640 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2a650 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2a660 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2a670 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2a680 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2a690 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2a6a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a6b0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2a6c0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2a6d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2a6e0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2a6f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2a700 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2a710 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2a720 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2a730 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2a740 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2a750 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2a760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a770 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2a780 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2a790 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2a7a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a7b0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2a7c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2a7d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2a7e0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2a7f0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2a800 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2a810 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a820 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2a830 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2a840 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2a850 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2a860 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2a870 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2a880 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2a890 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2a8a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a8b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a8c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2a8d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2a8e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2a8f0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2a900 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2a910 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2a920 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2a930 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a940 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2a950 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2a960 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2a970 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2a980 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2a990 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2a9a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2a9b0 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2a9c0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2a9d0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2a9e0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2a9f0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2aa00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2aa10 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2aa20 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2aa30 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2aa40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2aa50 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2aa60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aa70 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2aa80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2aa90 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2aaa0 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2aab0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2aac0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2aad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2aae0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2aaf0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2ab00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ab10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2ab20 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2ab30 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2ab40 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2ab50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2ab60 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2ab70 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2ab80 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2ab90 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2aba0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2abb0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2abc0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2abd0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2abe0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2abf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2ac00 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2ac10 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2ac20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2ac30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2ac40 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2ac50 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2ac60 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2ac70 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2ac80 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
2ac90 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2aca0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
2acb0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
2acc0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
2acd0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
2ace0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
2acf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2ad00 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2ad10 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2ad20 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2ad30 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2ad40 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2ad50 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2ad60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2ad70 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2ad80 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2ad90 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2ada0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2adb0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2adc0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2add0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2ade0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2adf0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2ae00 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2ae10 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2ae20 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2ae30 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2ae40 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2ae50 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2ae60 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2ae70 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2ae80 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2ae90 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2aea0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2aeb0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2aec0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2aed0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2aee0 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2aef0 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2af00 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2af10 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2af20 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2af30 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2af40 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2af50 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2af60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2af70 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2af80 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2af90 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2afa0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2afb0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2afc0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2afd0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2afe0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2aff0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2b000 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2b010 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2b020 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2b030 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2b040 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2b050 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2b060 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2b070 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2b080 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2b090 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2b0a0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2b0b0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2b0c0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2b0d0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2b0e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b0f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2b100 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2b110 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2b120 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2b130 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2b140 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2b150 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2b160 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2b170 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2b180 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2b190 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2b1a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b1b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2b1c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b1d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b1e0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2b1f0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2b200 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2b210 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2b220 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2b230 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2b240 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2b250 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2b260 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
2b270 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2b280 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2b290 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2b2a0 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2b2b0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2b2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b2d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2b2e0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2b2f0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2b300 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2b310 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2b320 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2b330 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2b340 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2b350 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2b360 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2b370 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2b380 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2b390 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2b3a0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2b3b0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2b3c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2b3d0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2b3e0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2b3f0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2b400 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2b410 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2b420 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2b430 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2b440 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2b450 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2b460 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b470 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2b480 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2b490 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2b4a0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2b4b0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2b4c0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2b4d0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2b4e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b4f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b500 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2b510 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2b520 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2b530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2b540 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b550 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2b560 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2b570 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2b580 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2b590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b5a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2b5b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2b5c0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2b5d0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2b5e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2b5f0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2b600 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2b610 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2b620 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2b630 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2b640 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2b650 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2b660 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2b670 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2b680 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2b690 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2b6a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2b6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b6c0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2b6d0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2b6e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2b6f0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2b700 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2b710 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2b720 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2b730 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2b740 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2b750 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2b760 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2b770 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2b780 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2b790 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2b7a0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2b7b0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2b7c0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2b7d0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2b7e0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2b7f0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2b800 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2b810 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2b820 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2b830 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2b840 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2b850 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2b860 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2b870 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2b880 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b890 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2b8a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2b8b0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2b8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2b8d0 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2b8e0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2b8f0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2b900 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b910 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b920 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
2b930 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2b940 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2b950 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2b960 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
2b970 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2b980 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2b990 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
2b9a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b9b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2b9c0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
2b9d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2b9e0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
2b9f0 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b  a!=0 );..      k
2ba00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2ba10 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20  unk->aData[4]); 
2ba20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f  /* # of leaves o
2ba30 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  n this trunk pag
2ba40 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b  e */.      if( k
2ba50 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2ba60 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2ba70 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2ba80 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2ba90 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2baa0 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2bab0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2bac0 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2bad0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2bae0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2baf0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2bb00 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2bb10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bb20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2bb30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2bb40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2bb50 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2bb60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2bb70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2bb80 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2bb90 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2bba0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2bbb0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2bbc0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2bbd0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2bbe0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2bbf0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2bc00 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2bc10 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2bc20 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2bc30 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2bc40 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2bc50 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2bc60 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2bc70 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2bc80 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2bc90 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2bca0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2bcb0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2bcc0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2bcd0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2bce0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bcf0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bd00 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2bd10 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2bd20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bd30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2bd40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2bd50 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2bd60 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2bd70 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2bd80 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2bd90 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2bda0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2bdb0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2bdc0 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2bdd0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2bde0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2bdf0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2be00 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2be10 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2be20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2be30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2be40 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2be50 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2be60 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2be70 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2be80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2be90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bea0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2beb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2bec0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2bed0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2bee0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2bef0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2bf00 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2bf10 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2bf20 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2bf30 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2bf40 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2bf50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2bf60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2bf70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2bf80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bf90 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2bfa0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2bfb0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2bfc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2bfe0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2bff0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2c000 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2c010 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2c020 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2c030 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2c040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c050 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c060 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2c070 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2c080 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2c090 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2c0a0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2c0b0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2c0c0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2c0d0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2c0e0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2c0f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2c100 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2c110 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c120 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2c130 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2c140 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2c150 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2c160 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2c170 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c180 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2c190 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2c1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2c1b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2c1c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2c1d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2c1e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2c200 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
2c210 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
2c220 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2c230 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2c240 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2c250 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c270 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c280 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2c290 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2c2a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2c2b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c2c0 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2c2d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2c2e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c300 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2c310 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2c320 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2c330 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2c340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c350 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2c360 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2c370 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2c380 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2c390 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2c3a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2c3b0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2c3c0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2c3d0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2c3e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2c3f0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2c400 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c410 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2c420 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2c430 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2c440 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2c450 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2c460 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2c470 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2c480 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2c490 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2c4a0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2c4b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2c4d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c4e0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2c4f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2c500 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c510 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2c520 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2c530 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2c540 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2c550 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2c560 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2c570 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2c580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c590 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2c5a0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2c5b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2c5c0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2c5d0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2c5e0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2c5f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2c600 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2c610 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2c620 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2c630 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2c640 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2c650 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2c660 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2c670 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2c680 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2c690 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2c6a0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2c6b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2c6c0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2c6d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2c6e0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2c6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2c700 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2c710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2c720 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2c730 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2c740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c750 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2c760 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2c770 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2c780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c7a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c7b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2c7c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c7d0 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2c7e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2c7f0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2c800 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2c810 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2c820 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2c830 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2c850 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2c860 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2c870 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2c880 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2c890 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2c8a0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2c8b0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2c8c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2c8d0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c8f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c920 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2c930 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2c940 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2c950 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2c960 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2c970 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2c980 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2c990 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2c9a0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2c9b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2c9c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c9d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2c9e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2c9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ca00 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2ca10 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2ca20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2ca30 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2ca40 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2ca50 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2ca60 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2ca70 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2ca80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2ca90 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2caa0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2cab0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2cac0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2cad0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2cae0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2caf0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2cb00 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2cb10 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb30 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2cb40 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2cb50 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2cb60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2cb70 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2cb80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2cb90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2cba0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2cbb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2cbc0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2cbd0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2cbe0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2cbf0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2cc00 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2cc10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cc20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2cc30 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2cc40 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2cc50 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2cc60 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2cc70 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
2cc80 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2cc90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2cca0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ccb0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2ccc0 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
2ccd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2cce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ccf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2cd00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2cd10 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2cd20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2cd30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cd40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2cd50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cd60 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2cd70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cd80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2cd90 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2cda0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2cdb0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2cdc0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2cdd0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2cde0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
2cdf0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
2ce00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2ce10 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
2ce20 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2ce30 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
2ce40 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
2ce50 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2ce60 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
2ce70 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
2ce80 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
2ce90 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2cea0 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
2ceb0 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
2cec0 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
2ced0 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
2cee0 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
2cef0 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
2cf00 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
2cf10 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
2cf20 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
2cf30 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
2cf40 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
2cf50 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
2cf60 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2cf70 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
2cf80 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
2cf90 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
2cfa0 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
2cfb0 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
2cfc0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
2cfd0 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
2cfe0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
2cff0 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
2d000 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
2d010 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
2d020 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
2d030 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
2d040 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
2d050 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
2d060 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
2d070 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
2d080 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
2d090 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
2d0a0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
2d0b0 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2d0c0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
2d0d0 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
2d0e0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
2d0f0 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
2d100 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
2d110 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
2d120 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
2d130 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2d140 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
2d150 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
2d160 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2d170 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
2d180 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
2d190 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
2d1a0 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
2d1b0 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
2d1c0 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
2d1d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
2d1e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2d1f0 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
2d200 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d210 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
2d220 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
2d230 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
2d240 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
2d250 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
2d260 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
2d270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d280 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
2d290 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2d2a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2d2b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
2d2c0 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
2d2d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2d2e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2d2f0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
2d300 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
2d310 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d320 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2d330 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2d340 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2d350 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
2d360 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
2d370 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
2d380 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2d390 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
2d3a0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
2d3b0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2d3c0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
2d3d0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
2d3e0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
2d3f0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
2d400 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
2d410 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
2d420 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
2d430 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
2d440 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
2d450 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
2d460 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2d470 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2d480 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
2d490 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
2d4a0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
2d4b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2d4c0 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
2d4d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2d4e0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
2d4f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2d500 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
2d510 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
2d520 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d550 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
2d560 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2d570 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
2d580 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d590 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d5a0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
2d5b0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
2d5c0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2d5d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d5e0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
2d5f0 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
2d600 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
2d610 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
2d620 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
2d630 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
2d640 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
2d650 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
2d660 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2d670 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2d680 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
2d690 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2d6a0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2d6b0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2d6c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d6d0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
2d6e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d6f0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2d700 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2d710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d720 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2d730 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
2d740 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
2d750 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2d760 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
2d770 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
2d780 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2d790 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d7a0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
2d7b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
2d7c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2d7d0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
2d7e0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2d7f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d800 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
2d810 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2d820 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
2d830 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
2d840 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2d850 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2d860 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
2d870 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d880 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
2d8a0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
2d8b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2d8c0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
2d8d0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2d8e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
2d8f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d900 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ble((*ppPage)->p
2d910 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
2d920 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d930 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2d940 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
2d950 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
2d960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2d970 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
2d980 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
2d990 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2d9a0 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
2d9b0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
2d9c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
2d9d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2d9e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
2d9f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2da00 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
2da10 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
2da20 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
2da30 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
2da40 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
2da50 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2da60 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
2da70 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
2da80 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
2da90 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
2daa0 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
2dab0 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
2dac0 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
2dad0 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
2dae0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
2daf0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2db00 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
2db10 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
2db20 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
2db30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2db40 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
2db50 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
2db60 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
2db70 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
2db80 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
2db90 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
2dba0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
2dbb0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2dbc0 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
2dbd0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2dbe0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2dbf0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
2dc00 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2dc10 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
2dc20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2dc30 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
2dc40 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
2dc50 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
2dc60 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc80 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
2dc90 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
2dca0 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2dcd0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2dce0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2dd10 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2dd20 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
2dd30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dd40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2dd50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2dd60 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a  ert( iPage>1 );.
2dd70 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
2dd80 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
2dd90 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
2dda0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
2ddb0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
2ddc0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
2ddd0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
2dde0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2ddf0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2de00 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
2de10 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
2de20 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
2de30 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
2de40 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
2de50 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
2de60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2de70 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2de80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2de90 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2dea0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
2deb0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2dec0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
2ded0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2dee0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
2def0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
2df00 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
2df10 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
2df20 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
2df30 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
2df40 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
2df50 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
2df60 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
2df70 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
2df80 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
2df90 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
2dfa0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
2dfb0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2dfc0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2dfd0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
2dff0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2e000 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2e010 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
2e020 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2e030 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2e040 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
2e050 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
2e060 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
2e070 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2e080 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2e090 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2e0a0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
2e0b0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
2e0c0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
2e0d0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
2e0e0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
2e0f0 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
2e100 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
2e110 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
2e120 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
2e130 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
2e140 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2e150 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2e160 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
2e170 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
2e180 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
2e190 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
2e1a0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
2e1b0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
2e1c0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2e1d0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
2e1e0 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
2e1f0 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
2e200 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2e210 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
2e220 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
2e230 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
2e240 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
2e250 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
2e260 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
2e270 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
2e280 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
2e290 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2e2a0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
2e2b0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
2e2c0 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
2e2d0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
2e2e0 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
2e2f0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
2e300 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
2e310 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
2e320 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
2e330 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2e340 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
2e350 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
2e360 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
2e370 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2e380 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e390 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
2e3a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2e3b0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
2e3c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2e3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e3e0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2e3f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
2e400 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
2e410 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2e420 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
2e430 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2e440 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
2e450 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
2e460 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2e470 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
2e480 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e490 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
2e4a0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2e4b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2e4c0 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
2e4d0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2e4e0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
2e4f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2e500 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
2e510 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
2e520 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
2e530 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
2e540 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
2e550 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2e560 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2e570 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
2e580 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
2e590 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
2e5a0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
2e5b0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
2e5c0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
2e5d0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2e5e0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
2e5f0 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
2e600 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
2e610 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
2e620 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
2e630 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
2e640 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
2e650 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
2e660 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
2e670 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
2e680 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2e690 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
2e6a0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
2e6b0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
2e6c0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
2e6d0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
2e6e0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
2e6f0 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
2e700 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2e710 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
2e720 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
2e730 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
2e740 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
2e750 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2e760 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
2e770 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
2e780 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
2e790 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
2e7a0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
2e7b0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
2e7c0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
2e7d0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
2e7e0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
2e7f0 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
2e800 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
2e810 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
2e820 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
2e830 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
2e840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2e850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2e860 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2e870 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e890 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2e8a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
2e8b0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
2e8c0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2e8d0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
2e8e0 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
2e8f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
2e900 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
2e910 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2e920 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
2e930 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2e940 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
2e950 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2e960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2e970 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
2e980 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
2e990 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
2e9a0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2e9b0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
2e9c0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
2e9d0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
2e9e0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
2e9f0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2ea00 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
2ea10 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
2ea20 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
2ea30 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
2ea40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
2ea50 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
2ea60 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
2ea70 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
2ea80 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
2ea90 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2eaa0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
2eab0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2eac0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
2ead0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
2eae0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
2eaf0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2eb00 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2eb10 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
2eb20 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
2eb30 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
2eb40 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2eb50 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
2eb60 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2eb70 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
2eb80 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
2eb90 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
2eba0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ebb0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
2ebc0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
2ebd0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2ebe0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2ebf0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2ec00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2ec10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ec20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
2ec30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2ec40 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
2ec50 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
2ec60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2ec70 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
2ec80 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2ec90 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2eca0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
2ecb0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2ecc0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
2ecd0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
2ece0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
2ecf0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
2ed00 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
2ed10 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
2ed20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2ed30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2ed40 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
2ed50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2ed60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2ed70 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
2ed80 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2ed90 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
2eda0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
2edb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
2edc0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
2edd0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
2ede0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
2edf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
2ee00 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2ee10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2ee20 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
2ee30 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2ee40 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20  local Cell size 
2ee50 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  (the number of b
2ee60 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67  ytes on the orig
2ee70 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74  inal page, omitt
2ee80 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29  ing.** overflow)
2ee90 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a   into *pnSize..*
2eea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2eeb0 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
2eec0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
2eed0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2eee0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2eef0 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
2ef00 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
2ef10 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
2ef20 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
2ef30 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20  .  u16 *pnSize  
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2ef50 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  rite the size of
2ef60 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a   the Cell here *
2ef70 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
2ef80 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2ef90 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2efa0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2efb0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2efc0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2efd0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2efe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2eff0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2f000 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2f010 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2f020 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2f030 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2f040 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
2f050 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f  Size;.  if( info
2f060 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
2f070 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2f080 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
2f090 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
2f0a0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
2f0b0 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
2f0c0 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69   }.  if( pCell+i
2f0d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20  nfo.iOverflow+3 
2f0e0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
2f0f0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
2f100 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f110 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f120 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
2f130 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
2f140 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
2f150 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
2f160 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
2f170 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
2f180 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2f190 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
2f1a0 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
2f1b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
2f1c0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
2f1d0 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
2f1e0 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
2f1f0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
2f200 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
2f210 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
2f220 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
2f230 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
2f240 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
2f250 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
2f260 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
2f270 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
2f280 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
2f290 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
2f2a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
2f2b0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
2f2c0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
2f2d0 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
2f2e0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
2f2f0 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
2f300 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
2f310 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
2f320 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
2f330 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
2f340 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2f350 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
2f360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f370 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f380 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
2f390 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
2f3a0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
2f3b0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
2f3c0 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
2f3d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f3e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
2f3f0 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
2f400 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
2f410 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
2f420 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
2f430 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
2f440 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2f450 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
2f460 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
2f470 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
2f480 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
2f490 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
2f4a0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
2f4b0 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
2f4c0 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
2f4d0 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
2f4e0 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
2f4f0 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
2f500 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
2f510 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
2f520 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
2f530 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
2f540 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
2f550 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
2f560 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
2f570 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2f580 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
2f590 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
2f5a0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
2f5b0 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
2f5c0 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
2f5d0 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
2f5e0 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
2f5f0 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
2f600 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
2f610 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
2f620 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2f630 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
2f640 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
2f650 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
2f660 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
2f670 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
2f680 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
2f690 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
2f6a0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
2f6b0 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
2f6c0 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
2f6d0 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
2f6e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2f6f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f700 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
2f710 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
2f720 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
2f730 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
2f740 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
2f750 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
2f760 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2f770 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
2f780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2f790 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f7a0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
2f7b0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
2f7c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2f7d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
2f7e0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
2f7f0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
2f800 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
2f810 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
2f820 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
2f830 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
2f840 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
2f850 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
2f860 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
2f870 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
2f880 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
2f890 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
2f8a0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
2f8b0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
2f8c0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
2f8d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
2f8e0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
2f8f0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
2f900 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
2f910 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
2f920 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
2f930 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
2f940 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
2f950 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
2f960 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
2f970 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
2f980 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
2f990 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
2f9a0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
2f9b0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
2f9c0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
2f9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2f9e0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
2f9f0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
2fa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fa10 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
2fa20 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
2fa30 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2fa40 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
2fa50 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
2fa60 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
2fa70 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2fa80 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2fa90 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
2faa0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
2fab0 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
2fac0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
2fad0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faf0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
2fb00 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
2fb10 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
2fb20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2fb40 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
2fb50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2fb60 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
2fb70 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
2fb80 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
2fb90 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
2fba0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
2fbb0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2fbc0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
2fbd0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2fbe0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
2fbf0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
2fc00 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
2fc10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2fc20 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
2fc30 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
2fc40 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
2fc50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2fc60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2fc70 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2fc80 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
2fc90 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
2fca0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
2fcb0 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
2fcc0 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
2fcd0 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
2fce0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
2fcf0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
2fd00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2fd10 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
2fd20 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
2fd30 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2fd40 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2fd50 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2fd60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2fd70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2fd80 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2fd90 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
2fda0 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
2fdb0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2fdc0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2fdd0 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2fde0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2fdf0 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
2fe00 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
2fe10 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
2fe20 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
2fe30 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2fe40 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20  t( nData==0 );. 
2fe50 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f     assert( nZero
2fe60 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65  ==0 );.  }.  nHe
2fe70 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2fe80 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2fe90 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2fea0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
2feb0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69  n the payload si
2fec0 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ze */.  if( pPag
2fed0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2fee0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2fef0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2ff00 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
2ff10 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
2ff20 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37  ( NEVER(nKey>0x7
2ff30 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
2ff40 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
2ff50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2ff60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2ff70 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69     nPayload = (i
2ff80 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2ff90 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2ffa0 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2ffb0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f    }.  if( nPaylo
2ffc0 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
2ffd0 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  cal ){.    n = n
2ffe0 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61  Header + nPayloa
2fff0 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  d;.    testcase(
30000 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73   n==3 );.    tes
30010 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20  tcase( n==4 );. 
30020 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d     if( n<4 ) n =
30030 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   4;.    *pnSize 
30040 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
30050 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ft = nPayload;. 
30060 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c     pPrior = pCel
30070 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
30080 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e  int mn = pPage->
30090 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20  minLocal;.    n 
300a0 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
300b0 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
300c0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
300d0 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63   - 4);.    testc
300e0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
300f0 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
30100 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
30110 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
30120 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61  .    if( n > pPa
30130 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e  ge->maxLocal ) n
30140 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65   = mn;.    space
30150 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70  Left = n;.    *p
30160 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61  nSize = n + nHea
30170 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72  der + 4;.    pPr
30180 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  ior = &pCell[nHe
30190 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70  ader+n];.  }.  p
301a0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
301b0 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a  [nHeader];..  /*
301c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76   At this point v
301d0 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20  ariables should 
301e0 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77  be set as follow
301f0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e  s:.  **.  **   n
30200 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
30210 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20    Total payload 
30220 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20  size in bytes.  
30230 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20  **   pPayload   
30240 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72          Begin wr
30250 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65  iting payload he
30260 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c  re.  **   spaceL
30270 65 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61  eft          Spa
30280 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ce available at 
30290 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50  pPayload.  If nP
302a0 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74  ayload>spaceLeft
302b0 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  ,.  **          
302c0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
302d0 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d   means content m
302e0 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f  ust spill into o
302f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
30300 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20   **   *pnSize   
30310 20 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66           Size of
30320 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20   the local cell 
30330 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76  (not counting ov
30340 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20  erflow pages).  
30350 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20  **   pPrior     
30360 20 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f          Where to
30370 20 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20   write the pgno 
30380 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
30390 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a  rflow page.  **.
303a0 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20    ** Use a call 
303b0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
303c0 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79  lPtr() to verify
303d0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
303e0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65   above.  ** were
303f0 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63   computed correc
30400 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51  tly..  */.#if SQ
30410 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
30420 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
30430 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
30440 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
30450 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
30460 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
30470 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61  r=(int)(info.pPa
30480 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29  yload - pCell) )
30490 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
304a0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
304b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
304c0 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
304d0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
304e0 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
304f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
30500 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
30510 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e   == &pCell[info.
30520 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20  iOverflow] );.  
30530 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
30540 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
30550 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
30560 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
30570 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
30580 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
30590 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
305a0 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
305b0 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
305c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
305d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
305e0 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
305f0 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
30600 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
30610 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
30620 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
30630 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
30640 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
30650 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
30660 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
30670 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
30680 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
30690 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
306a0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
306b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
306c0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
306d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
306e0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
306f0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
30700 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
30710 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
30720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30730 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30740 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
30750 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
30760 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
30770 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
30780 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
30790 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
307a0 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
307b0 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
307c0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
307d0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
307e0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
307f0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
30800 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
30810 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
30820 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
30830 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
30840 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
30850 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
30860 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
30870 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
30880 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
30890 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
308a0 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
308b0 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
308c0 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
308d0 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
308e0 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
308f0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  he uninitialized
30900 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
30910 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
30920 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
30930 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
30940 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
30950 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
30960 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
30970 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
30980 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
30990 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
309a0 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
309b0 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
309c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
309d0 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
309e0 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
309f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30a00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
30a10 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
30a20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30a30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
30a40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
30a50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30a60 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
30a70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30a80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
30a90 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
30aa0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
30ab0 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
30ac0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
30ad0 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
30ae0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
30af0 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
30b00 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
30b10 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
30b20 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
30b30 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
30b40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
30b50 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
30b60 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
30b70 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
30b80 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
30b90 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
30ba0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
30bb0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
30bc0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
30bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30be0 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
30bf0 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
30c00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
30c10 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
30c20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
30c30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30c40 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30c50 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
30c60 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
30c70 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
30c80 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
30c90 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
30ca0 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
30cb0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
30cc0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
30cd0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
30ce0 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
30cf0 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
30d00 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
30d10 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
30d20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
30d30 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
30d40 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
30d50 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
30d60 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
30d70 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
30d80 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
30d90 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
30da0 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
30db0 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
30dc0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
30dd0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
30de0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
30df0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
30e00 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
30e10 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
30e20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30e30 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
30e40 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
30e50 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
30e60 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
30e70 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
30e80 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
30e90 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
30ea0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
30eb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
30ec0 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
30ed0 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
30ee0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
30ef0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
30f00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
30f10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30f20 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
30f30 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
30f40 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
30f50 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
30f60 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
30f70 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
30f80 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
30f90 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
30fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30fb0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
30fc0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
30fd0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
30fe0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
30ff0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
31000 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
31010 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
31020 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
31030 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
31040 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
31050 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
31060 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
31070 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
31080 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
31090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
310a0 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
310b0 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
310c0 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
310d0 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
310e0 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
310f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
31100 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
31110 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
31120 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
31130 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
31140 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
31150 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
31160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
31170 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
31180 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
31190 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
311a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
311b0 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
311c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
311d0 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
311e0 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
311f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31200 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
31210 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33   int *pRC){.  u3
31220 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  2 pc;         /*
31230 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
31240 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
31250 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
31260 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
31270 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
31280 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
31290 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
312a0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
312b0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
312c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
312d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
312e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
312f0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
31300 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
31310 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
31320 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
31330 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
31340 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
31350 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
31360 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
31370 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
31380 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
31390 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
313a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
313b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
313c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
313d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
313e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
313f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
31400 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
31410 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
31420 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
31430 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
31440 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
31450 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
31460 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
31470 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
31480 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
31490 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
314a0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
314b0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
314c0 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
314d0 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
314e0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
314f0 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
31500 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
31510 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
31520 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
31530 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
31540 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
31550 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
31560 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
31570 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
31580 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
31590 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
315a0 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
315b0 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
315c0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
315d0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
315e0 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
315f0 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
31600 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f  nFree += 2;.}../
31610 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
31620 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
31630 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
31640 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
31650 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
31660 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
31670 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
31680 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
31690 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
316a0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
316b0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
316c0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
316d0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
316e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
316f0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
31700 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
31710 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
31720 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
31730 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
31740 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
31750 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
31760 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
31770 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
31780 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
31790 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
317a0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
317b0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
317c0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
317d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
317e0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
317f0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
31800 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
31810 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
31820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
31830 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
31840 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
31850 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
31860 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
31870 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
31880 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
31890 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
318a0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
318b0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
318c0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
318d0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
318e0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
318f0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
31900 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
31910 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
31920 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
31930 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
31940 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
31950 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
31960 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
31970 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
31980 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
31990 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
319a0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
319b0 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
319c0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
319d0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
319e0 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
319f0 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
31a00 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
31a10 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
31a20 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
31a30 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
31a40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
31a50 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
31a60 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
31a70 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
31a80 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
31a90 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
31aa0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
31ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
31ac0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
31ad0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
31ae0 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
31af0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
31b00 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
31b10 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
31b20 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
31b30 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
31b40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
31b50 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
31b60 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69  ole page */..  i
31b70 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
31b80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
31b90 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
31ba0 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
31bb0 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
31bc0 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
31bd0 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
31be0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31bf0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
31c00 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
31c10 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
31c20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
31c30 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
31c40 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
31c50 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
31c60 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
31c70 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
31c80 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
31c90 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
31ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31cb0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
31cc0 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
31cd0 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
31ce0 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
31cf0 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
31d00 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
31d10 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
31d20 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
31d30 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
31d40 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
31d50 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
31d60 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
31d70 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
31d80 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
31d90 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
31da0 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
31db0 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
31dc0 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
31dd0 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
31de0 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
31df0 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
31e00 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
31e10 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
31e20 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
31e30 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
31e40 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
31e50 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
31e60 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
31e70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
31e80 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
31e90 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
31ea0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
31eb0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
31ec0 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a  pTemp, pCell, sz
31ed0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
31ee0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
31ef0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
31f00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
31f10 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
31f20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
31f30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
31f40 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
31f50 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
31f60 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f  e->apOvfl)/sizeo
31f70 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  f(pPage->apOvfl[
31f80 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
31f90 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
31fa0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
31fb0 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
31fc0 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  6)i;.  }else{.  
31fd0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
31fe0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31ff0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32000 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
32020 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
32030 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
32040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32050 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32060 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
32070 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
32080 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
32090 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
320a0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
320b0 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
320c0 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
320d0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d  nCell;.    ins =
320e0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
320f0 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  i;.    rc = allo
32100 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
32110 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20   sz, &idx);.    
32120 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d  if( rc ){ *pRC =
32130 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20   rc; return; }. 
32140 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61     /* The alloca
32150 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  teSpace() routin
32160 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65  e guarantees the
32170 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70   following two p
32180 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a  roperties.    **
32190 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73   if it returns s
321a0 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73  uccess */.    as
321b0 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64  sert( idx >= end
321c0 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
321d0 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74  ( idx+sz <= (int
321e0 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
321f0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
32200 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
32210 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
32220 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
32230 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
32240 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20  ta[idx], pCell, 
32250 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  sz);.    if( iCh
32260 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
32270 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
32280 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
32290 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61  .    memmove(&da
322a0 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61  ta[ins+2], &data
322b0 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b  [ins], end-ins);
322c0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
322d0 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
322e0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
322f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32300 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
32310 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
32320 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32330 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
32340 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
32350 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
32360 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
32370 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
32380 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
32390 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
323a0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
323b0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
323c0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
323d0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
323e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
323f0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
32400 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
32410 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
32420 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
32430 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
32440 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
32450 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
32460 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
32470 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
32480 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
32490 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
324a0 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
324b0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
324c0 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
324d0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
324e0 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
324f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
32500 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
32510 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
32520 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
32530 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
32540 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
32550 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
32560 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
32570 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
32580 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
32590 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
325a0 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
325b0 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
325c0 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
325d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
325e0 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
325f0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
32600 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
32610 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
32620 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
32630 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
32640 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
32650 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32660 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d  rebuildPage(.  M
32670 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
32680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32690 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65  * Edit this page
326a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
326b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326c0 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
326d0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
326e0 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
326f0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
32700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
32710 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
32720 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
32730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32740 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
32750 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
32760 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
32770 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
32780 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
32790 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
327a0 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20  n pPg */.  u8 * 
327b0 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
327c0 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  g->aData;       
327d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
327e0 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a  o data for pPg *
327f0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73  /.  const int us
32800 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
32810 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
32820 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45  .  u8 * const pE
32830 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62  nd = &aData[usab
32840 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69  leSize];.  int i
32850 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
32860 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78   = pPg->aCellIdx
32870 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  ;.  u8 *pTmp = s
32880 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
32890 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
328a0 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44  Pager);.  u8 *pD
328b0 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32  ata;..  i = get2
328c0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
328d0 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  5]);.  memcpy(&p
328e0 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69  Tmp[i], &aData[i
328f0 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
32900 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70  i);..  pData = p
32910 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  End;.  for(i=0; 
32920 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
32930 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
32940 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  pCell[i];.    if
32950 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26  ( pCell>aData &&
32960 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20   pCell<pEnd ){. 
32970 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
32980 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
32990 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
329a0 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
329b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
329c0 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
329d0 5b 69 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  [i]);.    put2by
329e0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44  te(pCellptr, (pD
329f0 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  ata - aData));. 
32a00 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
32a10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
32a20 43 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a  Cell[i]==cellSiz
32a30 65 50 74 72 28 70 50 67 2c 20 70 43 65 6c 6c 29  ePtr(pPg, pCell)
32a40 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
32a50 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
32a60 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e  ld is now set in
32a70 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63  correctly. The c
32a80 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69  aller will fix i
32a90 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65  t. */.  pPg->nCe
32aa0 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50  ll = nCell;.  pP
32ab0 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  g->nOverflow = 0
32ac0 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  ;..  put2byte(&a
32ad0 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b  Data[hdr+1], 0);
32ae0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
32af0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
32b00 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
32b10 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
32b20 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
32b30 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  ;.  aData[hdr+7]
32b40 20 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a   = 0x00;.}../*.*
32b50 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
32b60 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
32b70 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
32b80 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
32b90 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
32ba0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
32bb0 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
32bc0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
32bd0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
32be0 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
32bf0 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
32c00 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
32c10 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
32c20 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
32c30 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
32c40 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
32c50 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
32c60 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
32c70 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
32c80 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
32c90 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
32ca0 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
32cb0 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
32cc0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
32cd0 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
32ce0 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
32cf0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
32d00 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
32d10 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
32d20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
32d30 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
32d40 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
32d50 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
32d60 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
32d70 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
32d80 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
32d90 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
32da0 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
32db0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
32dc0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
32dd0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
32de0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
32df0 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
32e00 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
32e10 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
32e20 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
32e30 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
32e40 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32e50 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
32e60 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
32e70 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
32e80 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
32e90 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
32ea0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
32eb0 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
32ec0 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
32ed0 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
32ee0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
32ef0 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
32f00 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
32f10 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
32f20 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
32f30 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
32f40 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
32f50 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
32f60 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
32f70 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
32f80 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
32f90 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
32fa0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
32fb0 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
32fc0 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
32fd0 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
32fe0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
32ff0 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
33000 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
33010 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
33020 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
33030 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
33040 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
33050 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
33060 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
33070 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
33080 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
33090 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
330a0 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
330b0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
330c0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
330d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
330e0 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
330f0 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
33100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33110 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
33120 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
33130 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
33140 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
33150 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
33160 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
33170 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
33180 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
331b0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
331c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
331d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
331f0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
33200 74 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a  to pPg */.  u8 *
33210 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
33220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
33230 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
33240 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33260 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
33270 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
33280 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61    int i;.  u8 *a
33290 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
332a0 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d  a;.  u8 *pData =
332b0 20 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73   *ppData;.  cons
332c0 74 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20  t int bFreelist 
332d0 3d 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44  = aData[1] || aD
332e0 61 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74  ata[2];.  assert
332f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
33300 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  pPg->hdrOffset==
33310 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72  0 );    /* Never
33320 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
33330 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 */.  for(i=0; 
33340 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
33350 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65     int sz = szCe
33360 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72  ll[i];.    int r
33370 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  c;.    u8 *pSlot
33380 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c  ;.    if( bFreel
33390 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74  ist==0 || (pSlot
333a0 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
333b0 70 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29  pPg, sz, &rc, 0)
333c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  )==0 ){.      pD
333d0 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20  ata -= sz;.     
333e0 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
333f0 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  n ) return 1;.  
33400 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
33410 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  a;.    }.    mem
33420 63 70 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c  cpy(pSlot, apCel
33430 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70  l[i], sz);.    p
33440 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
33450 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61  , (pSlot - aData
33460 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
33470 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70   += 2;.  }.  *pp
33480 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
33490 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
334a0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
334b0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
334c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
334d0 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
334e0 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74   szCell .** cont
334f0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
33500 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
33510 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
33520 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65  unction adds the
33530 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69  .** space associ
33540 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  ated with each c
33550 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
33560 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
33570 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69  ly stored .** wi
33580 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  thin the body of
33590 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20   pPg to the pPg 
335a0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63  free-list. The c
335b0 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell-pointers and
335c0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73   other.** fields
335d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65   of the page are
335e0 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a   not updated..**
335f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
33600 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
33610 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  tal number of ce
33620 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  lls added to the
33630 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73   free-list..*/.s
33640 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72  tatic int pageFr
33650 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  eeArray(.  MemPa
33660 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
33670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
33680 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20  ge to edit */.  
33690 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336b0 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65  /* Cells to dele
336c0 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  te */.  u8 **apC
336d0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
336e0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
336f0 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
33700 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33720 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
33730 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  sizes */.){.  u8
33740 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
33750 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
33760 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
33770 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74   &aData[pPg->pBt
33780 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
33790 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61   u8 * const pSta
337a0 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  rt = &aData[pPg-
337b0 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b  >hdrOffset + 8 +
337c0 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69   pPg->childPtrSi
337d0 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20  ze];.  int nRet 
337e0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
337f0 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20  u8 *pFree = 0;. 
33800 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b   int szFree = 0;
33810 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
33820 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
33830 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
33840 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
33850 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20  Cell>=pStart && 
33860 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20  pCell<pEnd ){.  
33870 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43      int sz = szC
33880 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ell[i];.      if
33890 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20  ( pFree!=(pCell 
338a0 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  + sz) ){.       
338b0 20 69 66 28 20 70 46 72 65 65 20 29 20 66 72 65   if( pFree ) fre
338c0 65 53 70 61 63 65 28 70 50 67 2c 20 70 46 72 65  eSpace(pPg, pFre
338d0 65 20 2d 20 61 44 61 74 61 2c 20 73 7a 46 72 65  e - aData, szFre
338e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 65  e);.        pFre
338f0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
33900 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
33910 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
33920 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
33930 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
33940 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
33950 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
33960 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
33970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
33980 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
33990 20 20 69 66 28 20 70 46 72 65 65 20 29 20 66 72    if( pFree ) fr
339a0 65 65 53 70 61 63 65 28 70 50 67 2c 20 70 46 72  eeSpace(pPg, pFr
339b0 65 65 20 2d 20 61 44 61 74 61 2c 20 73 7a 46 72  ee - aData, szFr
339c0 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  ee);.  return nR
339d0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
339e0 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
339f0 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65  d is invalid whe
33a00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33a10 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74  returns. It is t
33a20 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  he.** responsibi
33a30 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
33a40 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
33a50 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
33a60 63 20 76 6f 69 64 20 65 64 69 74 50 61 67 65 28  c void editPage(
33a70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20     /* Edit this 
33aa0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  page */.  int iO
33ab0 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
33ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
33ad0 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
33ae0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61   currently on pa
33af0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  ge */.  int iNew
33b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33b10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
33b20 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63 65   of new first ce
33b30 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ll on page */.  
33b40 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20  int nNew,       
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b60 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
33b70 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
33b80 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
33b90 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
33ba0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
33bb0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
33bc0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
33bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33be0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
33bf0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  zes */.){.  u8 *
33c00 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
33c10 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e  Pg->aData;.  con
33c20 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
33c30 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
33c40 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67  8 *pBegin = &pPg
33c50 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20  ->aCellIdx[nNew 
33c60 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  * 2];.  int nCel
33c70 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20  l = pPg->nCell; 
33c80 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73        /* Cells s
33c90 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a  tored on pPg */.
33ca0 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75    u8 *pData;.  u
33cb0 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69  8 *pCellptr;.  i
33cc0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64  nt i;.  int iOld
33cd0 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67  End = iOld + pPg
33ce0 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e  ->nCell + pPg->n
33cf0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20  Overflow;.  int 
33d00 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b  iNewEnd = iNew +
33d10 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
33d20 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
33d30 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
33d40 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
33d50 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
33d60 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c  ;.  memcpy(pTmp,
33d70 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74   aData, pPg->pBt
33d80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23  ->usableSize);.#
33d90 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f  endif..  /* Remo
33da0 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  ve cells from th
33db0 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
33dc0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
33dd0 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29   if( iOld<iNew )
33de0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74  {.    int nShift
33df0 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79   = pageFreeArray
33e00 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69  (.        pPg, i
33e10 4e 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65 6c  New-iOld, &apCel
33e20 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c 6c  l[iOld], &szCell
33e30 5b 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20 20  [iOld].    );.  
33e40 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61    memmove(pPg->a
33e50 43 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61  CellIdx, &pPg->a
33e60 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32  CellIdx[nShift*2
33e70 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20  ], nCell*2);.   
33e80 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74   nCell -= nShift
33e90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77  ;.  }.  if( iNew
33ea0 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b  End < iOldEnd ){
33eb0 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61  .    nCell -= pa
33ec0 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 20  geFreeArray(.   
33ed0 20 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45 6e       pPg, iOldEn
33ee0 64 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43 65  d-iNewEnd, &apCe
33ef0 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73 7a  ll[iNewEnd], &sz
33f00 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20 20  Cell[iNewEnd].  
33f10 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74    );.  }..  pDat
33f20 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62  a = &aData[get2b
33f30 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
33f40 5d 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ])];.  if( pData
33f50 3c 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65  <pBegin ) goto e
33f60 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20  ditpage_fail;.. 
33f70 20 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f   /* Add cells to
33f80 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
33f90 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  e page */.  if( 
33fa0 69 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20  iNew<iOld ){.   
33fb0 20 69 6e 74 20 6e 41 64 64 20 3d 20 69 4f 6c 64   int nAdd = iOld
33fc0 2d 69 4e 65 77 3b 0a 20 20 20 20 70 43 65 6c 6c  -iNew;.    pCell
33fd0 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
33fe0 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  Idx;.    memmove
33ff0 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a  (&pCellptr[nAdd*
34000 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43  2], pCellptr, nC
34010 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ell*2);.    if( 
34020 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
34030 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20  .          pPg, 
34040 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20  pBegin, &pData, 
34050 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20  pCellptr,.      
34060 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43 65 6c      nAdd, &apCel
34070 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c  l[iNew], &szCell
34080 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29 20 67  [iNew].    ) ) g
34090 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
340a0 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20  l;.    nCell += 
340b0 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nAdd;.  }..  /* 
340c0 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  Add any overflow
340d0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28   cells */.  for(
340e0 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65  i=0; i<pPg->nOve
340f0 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  rflow; i++){.   
34100 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f   int iCell = (iO
34110 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c  ld + pPg->aiOvfl
34120 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20  [i]) - iNew;.   
34130 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26   if( iCell>=0 &&
34140 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20   iCell<nNew ){. 
34150 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 70 74       u8 *pCellpt
34160 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
34170 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20  dx[iCell * 2];. 
34180 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43       memmove(&pC
34190 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c  ellptr[2], pCell
341a0 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43  ptr, (nCell - iC
341b0 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20  ell) * 2);.     
341c0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
341d0 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
341e0 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  ray(.           
341f0 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
34200 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
34210 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 26              1, &
34220 61 70 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69  apCell[iCell + i
34230 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43  New], &szCell[iC
34240 65 6c 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20  ell + iNew].    
34250 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
34260 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a  age_fail;.    }.
34270 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
34280 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e   cells to the en
34290 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
342a0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
342b0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  Pg->aCellIdx[nCe
342c0 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67  ll*2];.  if( pag
342d0 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
342e0 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
342f0 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
34300 70 74 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65  ptr,.        nNe
34310 77 2d 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c  w-nCell, &apCell
34320 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73  [iNew+nCell], &s
34330 7a 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c  zCell[iNew+nCell
34340 5d 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69  ].  ) ) goto edi
34350 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70  tpage_fail;..  p
34360 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77  Pg->nCell = nNew
34370 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
34380 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
34390 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
343a0 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
343b0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
343c0 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
343d0 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65  - aData);..#ifde
343e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
343f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
34400 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b   && !CORRUPT_DB;
34410 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
34420 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b  Cell = apCell[i+
34430 69 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69  iNew];.    int i
34440 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65 28 26  Off = get2byte(&
34450 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a  pPg->aCellIdx[i*
34460 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65  2]);.    if( pCe
34470 6c 6c 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65  ll>=aData && pCe
34480 6c 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70  ll<&aData[pPg->p
34490 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
344a0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  ){.      pCell =
344b0 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61   &pTmp[pCell - a
344c0 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Data];.    }.   
344d0 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
344e0 6d 70 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61  mp(pCell, &aData
344f0 5b 69 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69  [iOff], szCell[i
34500 2b 69 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23  +iNew]) );.  }.#
34510 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b  endif..  return;
34520 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a  . editpage_fail:
34530 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  .  /* Unable to 
34540 65 64 69 74 20 74 68 69 73 20 70 61 67 65 2e 20  edit this page. 
34550 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20  Rebuild it from 
34560 73 63 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e  scratch instead.
34570 20 2a 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67   */.  rebuildPag
34580 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70  e(pPg, nNew, &ap
34590 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43  Cell[iNew], &szC
345a0 65 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f  ell[iNew]);.}../
345b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
345c0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
345d0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
345e0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
345f0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
34600 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
34610 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
34620 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
34630 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
34640 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
34650 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
34660 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
34670 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
34680 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
34690 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
346a0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
346b0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
346c0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
346d0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
346e0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
346f0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
34700 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
34710 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
34720 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
34730 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
34740 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
34750 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
34760 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
34770 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
34780 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
34790 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
347a0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
347b0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
347c0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
347d0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
347e0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
347f0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
34800 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
34810 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
34820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34830 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
34840 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
34850 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
34860 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
34870 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
34880 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
34890 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
348a0 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
348b0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
348c0 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
348d0 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
348e0 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
348f0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
34900 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
34910 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
34920 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
34930 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
34940 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
34950 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
34960 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
34970 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
34980 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
34990 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
349a0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
349b0 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
349c0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
349d0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
349e0 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
349f0 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
34a00 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
34a10 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
34a20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
34a30 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
34a40 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
34a50 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
34a60 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
34a70 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
34a80 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
34a90 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
34aa0 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
34ab0 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
34ac0 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
34ad0 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
34ae0 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
34af0 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
34b00 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
34b10 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
34b20 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
34b30 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
34b40 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
34b50 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
34b60 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
34b70 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
34b80 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
34b90 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
34ba0 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
34bb0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
34bc0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
34bd0 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
34be0 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
34bf0 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
34c00 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
34c10 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
34c20 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
34c30 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
34c40 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
34c50 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
34c60 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
34c70 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
34c80 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
34c90 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
34ca0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
34cb0 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
34cc0 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
34cd0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
34ce0 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
34cf0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
34d00 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
34d10 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
34d20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
34d30 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
34d40 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
34d50 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
34d60 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
34d70 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
34d80 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
34d90 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
34da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
34db0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
34dc0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34df0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
34e00 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
34e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34e30 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
34e40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34e50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
34e60 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
34e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
34e80 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34e90 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
34ea0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
34eb0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
34ec0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
34ed0 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
34ee0 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
34ef0 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
34f00 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
34f10 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
34f20 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20  age->nCell==0 ) 
34f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34f40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
34f50 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
34f60 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
34f70 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
34f80 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
34f90 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
34fa0 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
34fb0 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
34fc0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
34fd0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
34fe0 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
34ff0 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
35000 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
35010 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
35020 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
35030 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
35040 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
35050 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
35060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35070 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
35080 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
35090 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
350a0 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  = pPage->apOvfl[
350b0 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  0];.    u16 szCe
350c0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
350d0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
350e0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
350f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35100 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35110 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
35120 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
35130 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
35140 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
35150 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
35160 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
35170 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
35180 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
35190 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
351a0 20 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70     rebuildPage(p
351b0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
351c0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e  &szCell);.    pN
351d0 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ew->nFree = pBt-
351e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e  >usableSize - pN
351f0 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d  ew->cellOffset -
35200 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20   2 - szCell;..  
35210 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
35220 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
35230 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
35240 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
35250 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
35260 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
35270 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
35280 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
35290 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
352a0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
352b0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
352c0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
352d0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
352e0 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
352f0 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
35300 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
35310 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
35320 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
35330 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
35340 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
35350 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
35360 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
35370 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
35380 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
35390 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
353a0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
353b0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
353c0 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
353d0 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
353e0 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
353f0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
35400 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
35410 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
35420 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
35430 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
35440 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
35450 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
35460 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
35470 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
35480 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
35490 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
354a0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
354b0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
354c0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
354d0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
354e0 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
354f0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
35500 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
35510 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
35520 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
35530 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
35540 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
35550 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
35560 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
35570 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
35580 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
35590 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
355a0 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
355b0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
355c0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
355d0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
355e0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
355f0 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
35600 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
35610 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
35620 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
35630 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
35640 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
35650 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
35660 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
35670 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
35680 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
35690 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
356a0 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
356b0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
356c0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
356d0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
356e0 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
356f0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
35700 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
35710 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
35720 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
35730 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
35740 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
35750 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
35760 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
35770 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
35780 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
35790 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
357a0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
357b0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
357c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
357d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
357e0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
357f0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
35800 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
35810 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
35820 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
35830 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
35840 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
35850 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
35860 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
35870 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
35880 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
35890 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
358a0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
358b0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
358c0 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
358d0 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
358e0 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
358f0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
35900 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
35910 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
35920 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
35930 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
35940 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
35950 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
35960 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
35970 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
35980 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
35990 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
359a0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
359b0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
359c0 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
359d0 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
359e0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
359f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
35a00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
35a10 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
35a20 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
35a30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35a40 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
35a50 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
35a60 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
35a70 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
35a80 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
35a90 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
35aa0 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
35ab0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
35ac0 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
35ad0 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
35ae0 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
35af0 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
35b00 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
35b10 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
35b20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
35b30 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
35b40 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
35b50 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
35b60 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
35b70 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
35b80 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
35b90 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
35ba0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
35bb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
35bc0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
35bd0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
35be0 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
35bf0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
35c00 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
35c10 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
35c20 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
35c30 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
35c40 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
35c50 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
35c60 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
35c70 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
35c80 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
35c90 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
35ca0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
35cb0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
35cc0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
35cd0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
35ce0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
35cf0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
35d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
35d20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
35d30 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
35d40 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
35d50 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
35d60 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
35d70 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
35d80 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
35d90 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
35da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35db0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
35dc0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
35dd0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
35de0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
35df0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
35e00 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
35e10 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
35e20 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
35e30 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
35e40 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
35e50 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
35e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
35e70 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
35e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
35e90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
35ea0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
35eb0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
35ec0 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
35ed0 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
35ee0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
35ef0 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
35f00 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
35f10 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
35f20 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
35f30 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
35f40 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
35f50 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
35f60 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
35f70 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
35f80 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
35f90 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
35fa0 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
35fb0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
35fc0 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
35fd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
35fe0 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
35ff0 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
36000 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
36010 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
36020 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
36030 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
36040 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
36050 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
36060 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
36070 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
36080 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61  ge.apOvfl[] arra
36090 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
360a0 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
360b0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
360c0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
360d0 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
360e0 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
360f0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
36100 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
36110 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
36120 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
36130 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
36140 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
36150 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
36160 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
36170 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
36180 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
36190 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
361a0 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
361b0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
361c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
361d0 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
361e0 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
361f0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
36200 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
36210 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
36220 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
36230 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
36240 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
36250 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
36260 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
36270 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
36280 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
36290 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
362a0 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
362b0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
362c0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
362d0 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
362e0 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
362f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
36300 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
36310 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
36320 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
36330 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
36340 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
36350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
36360 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
36370 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
36380 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
36390 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
363a0 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
363b0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
363c0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
363d0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
363e0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
363f0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
36400 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
36410 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
36420 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
36430 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
36440 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
36450 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
36460 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
36470 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
36480 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
36490 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
364a0 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
364b0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
364c0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
364d0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
364e0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
364f0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
36500 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
36510 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
36520 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
36530 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
36540 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
36550 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
36560 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
36570 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
36580 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
36590 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
365a0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
365b0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
365c0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
365d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
365e0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
365f0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
36600 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
36610 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
36620 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
36630 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
36640 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
36650 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
36660 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
36670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
36680 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
36690 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
366a0 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
366b0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
366c0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
366d0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
366e0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
366f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
36700 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
36710 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
36720 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
36730 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
36740 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
36750 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
36760 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
36770 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
36780 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
36790 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
367a0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
367b0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
367c0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
367d0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
367e0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
367f0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
36800 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
36810 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
36820 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
36830 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
36840 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
36850 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
36860 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
36870 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
36880 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
36890 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
368a0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
368b0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
368c0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
368d0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
368e0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
368f0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
36900 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
36910 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
36920 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
36930 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
36940 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
36950 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
36960 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
36970 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
36980 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
36990 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
369a0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
369b0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
369c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
369d0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
369e0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
369f0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
36a00 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
36a10 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
36a20 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
36a30 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
36a40 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
36a50 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
36a60 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
36a70 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
36a80 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
36a90 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
36aa0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
36ab0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
36ac0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
36ad0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
36ae0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
36af0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
36b00 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
36b10 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
36b20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
36b30 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
36b40 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
36b50 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
36b60 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
36b70 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
36b80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
36b90 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
36ba0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
36bb0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
36bc0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
36bd0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
36be0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
36bf0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
36c00 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
36c10 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
36c20 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
36c30 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
36c40 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
36c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
36c60 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
36c70 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
36c80 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
36c90 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
36ca0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
36cb0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
36cc0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
36cd0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
36ce0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
36cf0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
36d00 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
36d10 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
36d20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
36d30 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
36d40 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
36d50 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
36d60 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
36d70 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
36d80 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
36d90 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
36da0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
36db0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
36dc0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
36dd0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
36de0 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
36df0 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
36e00 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
36e10 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
36e20 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
36e30 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
36e40 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
36e50 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
36e60 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
36e70 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
36e80 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
36e90 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
36ea0 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
36eb0 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
36ec0 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
36ed0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
36ee0 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
36ef0 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
36f00 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
36f10 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
36f20 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
36f30 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
36f40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
36f50 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
36f60 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  M..*/.#if define
36f70 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f  d(_MSC_VER) && _
36f80 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20  MSC_VER >= 1700 
36f90 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52  && defined(_M_AR
36fa0 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d  M).#pragma optim
36fb0 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e  ize("", off).#en
36fc0 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62  dif.static int b
36fd0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
36fe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
36ff0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
37000 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
37010 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
37020 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
37030 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
37040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37050 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
37060 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
37070 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
37080 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
37090 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
370a0 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
370b0 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
370c0 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
370d0 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
370e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
370f0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
37100 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
37110 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20  int bBulk       
37120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37130 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
37140 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20  call is part of 
37150 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29  a bulk load */.)
37160 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
37170 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37180 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
37190 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
371a0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
371b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
371c0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
371d0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
371e0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
371f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
37200 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
37210 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
37220 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
37230 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
37240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
37250 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
37260 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
37270 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
37280 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
37290 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
372a0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
372b0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
372c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
372d0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
372e0 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
372f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
37300 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
37310 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
37320 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
37330 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
37350 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
37360 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
37370 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
37380 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
37390 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
373a0 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
373b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373c0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
373d0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
373e0 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
373f0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
37400 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
37410 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
37420 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
37430 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
37440 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
37450 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
37460 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
37470 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
37480 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
37490 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
374a0 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
374b0 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
374c0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
374d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
374e0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
374f0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
37500 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
37510 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
37520 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
37530 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
37540 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
37550 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
37560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
37570 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
37580 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
37590 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
375a0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
375b0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
375c0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
375d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
375e0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
375f0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
37600 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
37610 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
37620 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
37630 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37640 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
37650 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
37660 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
37670 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
37680 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
37690 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
376a0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
376b0 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
376c0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
376d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
376e0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
376f0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
37700 2f 0a 20 20 69 6e 74 20 63 6e 74 4f 6c 64 5b 4e  /.  int cntOld[N
37710 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
37720 20 2f 2a 20 4f 6c 64 20 69 6e 64 65 78 20 69 6e   /* Old index in
37730 20 61 43 65 6c 6c 5b 5d 20 61 66 74 65 72 20 69   aCell[] after i
37740 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
37750 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
37760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
37770 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
37780 65 6c 6c 73 20 70 6c 61 63 65 64 20 6f 6e 20 69  ells placed on i
37790 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
377a0 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
377b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
377c0 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
377d0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
377e0 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
377f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
37800 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
37810 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
37820 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
37830 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37840 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
37850 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
37860 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
37870 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
37880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
37890 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
378a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
378b0 2a 2f 0a 20 20 75 38 20 61 62 44 6f 6e 65 5b 4e  */.  u8 abDone[N
378c0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
378d0 20 20 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20    /* True after 
378e0 69 27 74 68 20 6e 65 77 20 70 61 67 65 20 69 73  i'th new page is
378f0 20 70 6f 70 75 6c 61 74 65 64 20 2a 2f 0a 20 20   populated */.  
37900 50 67 6e 6f 20 61 50 67 6e 6f 5b 4e 42 2b 32 5d  Pgno aPgno[NB+2]
37910 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
37920 50 61 67 65 20 6e 75 6d 62 65 72 73 20 6f 66 20  Page numbers of 
37930 6e 65 77 20 70 61 67 65 73 20 62 65 66 6f 72 65  new pages before
37940 20 73 68 75 66 66 6c 69 6e 67 20 2a 2f 0a 20 20   shuffling */.  
37950 50 67 6e 6f 20 61 50 67 4f 72 64 65 72 5b 4e 42  Pgno aPgOrder[NB
37960 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  +2];         /* 
37970 43 6f 70 79 20 6f 66 20 61 50 67 6e 6f 5b 5d 20  Copy of aPgno[] 
37980 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67  used for sorting
37990 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 31 36 20   pages */.  u16 
379a0 61 50 67 46 6c 61 67 73 5b 4e 42 2b 32 5d 3b 20  aPgFlags[NB+2]; 
379b0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
379c0 73 20 66 69 65 6c 64 20 6f 66 20 6e 65 77 20 70  s field of new p
379d0 61 67 65 73 20 62 65 66 6f 72 65 20 73 68 75 66  ages before shuf
379e0 66 6c 69 6e 67 20 2a 2f 0a 0a 20 20 6d 65 6d 73  fling */..  mems
379f0 65 74 28 61 62 44 6f 6e 65 2c 20 30 2c 20 73 69  et(abDone, 0, si
37a00 7a 65 6f 66 28 61 62 44 6f 6e 65 29 29 3b 0a 20  zeof(abDone));. 
37a10 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
37a20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
37a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37a40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
37a50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37a60 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37a70 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
37a80 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
37a90 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
37aa0 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
37ab0 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
37ac0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
37ad0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
37ae0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
37af0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
37b00 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
37b10 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
37b20 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
37b30 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
37b40 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
37b50 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
37b60 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
37b70 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
37b80 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
37b90 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
37ba0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
37bb0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
37bc0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
37bd0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
37be0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
37bf0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
37c00 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
37c10 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
37c20 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
37c30 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
37c40 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
37c50 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61  ->aiOvfl[0]==iPa
37c60 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
37c70 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
37c80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37c90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
37ca0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
37cb0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
37cc0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
37cd0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
37ce0 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
37cf0 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
37d00 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
37d10 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
37d20 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
37d30 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
37d40 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
37d50 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
37d60 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
37d70 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
37d80 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
37d90 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
37da0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
37db0 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
37dc0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
37dd0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
37de0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
37df0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
37e00 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
37e10 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
37e20 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
37e30 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
37e40 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
37e50 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
37e60 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
37e70 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
37e80 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
37e90 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
37ea0 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
37eb0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
37ec0 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
37ed0 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
37ee0 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
37ef0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
37f00 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
37f10 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
37f20 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
37f30 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
37f40 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
37f50 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
37f60 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
37f70 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b  0 || bBulk==1 );
37f80 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
37f90 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
37fa0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
37fb0 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
37fc0 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
37fd0 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
37fe0 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75   nxDiv = i-2+bBu
37ff0 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  lk;.    }else{. 
38000 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75       assert( bBu
38010 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  lk==0 );.      n
38020 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
38030 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
38040 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a   = 2-bBulk;.  }.
38050 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
38060 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
38070 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
38080 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
38090 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
380a0 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
380b0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
380c0 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
380d0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
380e0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
380f0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
38100 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
38110 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
38120 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
38130 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
38140 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
38150 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
38160 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Old[i], 0);.    
38170 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
38180 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
38190 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
381a0 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
381b0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
381c0 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
381d0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
381e0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
381f0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
38200 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
38210 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
38220 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
38230 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
38240 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  0] && pParent->n
38250 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
38260 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
38270 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  rent->apOvfl[0];
38280 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
38290 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
382a0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
382b0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
382c0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
382d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
382e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
382f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
38300 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
38310 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
38320 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
38330 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
38340 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
38350 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
38360 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
38370 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
38380 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
38390 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
383a0 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
383b0 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
383c0 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
383d0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
383e0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
383f0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
38400 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
38410 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
38420 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
38430 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
38440 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
38450 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
38460 73 74 0a 20 20 20 20 20 20 2a