/ Hex Artifact Content
Login

Artifact 4db5e06ca2d1a5437be7075251fa702c76179b0e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1850: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1860: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1870: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1880: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1890: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
18a0: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
18b0: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
18c0: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
18d0: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
18e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
18f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1900: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1910: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1920: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1930: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1940: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1950: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1960: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1970: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1990: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
19a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
19b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
19c0: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
19d0: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
19e0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
19f0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1a00: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1a10: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1a20: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1a30: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1a40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1a60: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1a70: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1a80: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1a90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1aa0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1ab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ac0: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1ad0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ae0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1af0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b00: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1b10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1b20: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1b30: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1b40: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1b50: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1b60: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1b70: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1b80: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1b90: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1ba0: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1bb0: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1bc0: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1bd0: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1be0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1bf0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1c00: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1c10: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1c20: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1c30: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1c40: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1c50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1c60: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1c70: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1c80: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1c90: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1cb0: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1cc0: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1cd0: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ce0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1cf0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1d00: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1d10: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1d20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1d30: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1d40: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1d50: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1d60: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1d70: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d80: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1d90: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1da0: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1db0: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1dc0: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1dd0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1de0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1df0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1e00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1e10: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1e20: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1e30: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
1e40: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
1e50: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
1e60: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
1e70: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
1e80: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1e90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1eb0: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
1ec0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
1ed0: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
1ee0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
1ef0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
1f00: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1f10: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
1f20: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
1f30: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
1f40: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
1f50: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
1f60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1f70: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
1f80: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
1f90: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
1fa0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
1fb0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
1fc0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
1fd0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
1fe0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ff0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2000: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
2010: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2020: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2030: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2050: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2060: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2070: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2080: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2090: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
20a0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
20b0: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
20c0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
20d0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
20e0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
20f0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
2100: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
2110: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
2120: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
2130: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2140: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2150: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2160: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2170: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2180: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2190: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
21a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
21b0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
21c0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
21d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
21e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
21f0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
2200: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
2210: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
2220: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2230: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2240: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2250: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2260: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2270: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2280: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2290: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
22a0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
22b0: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
22c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
22e0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
22f0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
2300: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
2310: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
2320: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
2330: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2340: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2350: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2360: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2370: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2380: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2390: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
23a0: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
23b0: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
23c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
23d0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
23e0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
23f0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2400: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2410: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
2420: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
2430: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2440: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2450: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2460: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2470: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2480: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2490: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
24a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
24b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
24c0: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
24d0: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
24e0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
24f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
2500: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
2510: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
2520: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
2530: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2540: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2550: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2560: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2570: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2580: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2590: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
25a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
25b0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
25c0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
25d0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
25e0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
25f0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
2600: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
2610: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
2620: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
2630: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2640: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2650: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2660: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2670: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2680: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2690: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
26a0: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
26b0: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
26c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
26d0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
26e0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
26f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
2700: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
2710: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2720: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2730: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2750: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2760: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2770: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2790: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
27a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
27b0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
27c0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
27d0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
27e0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
27f0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
2800: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
2810: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2820: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2830: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2840: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2850: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2860: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2870: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2880: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2890: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
28a0: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
28b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
28c0: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
28d0: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
28e0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
28f0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2900: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2910: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2920: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2930: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2940: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2950: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2960: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2970: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2980: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2990: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
29a0: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
29b0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29c0: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
29d0: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
29e0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
29f0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2a00: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2a10: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2a20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2a30: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2a40: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2a50: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2a60: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2a70: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2a80: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2a90: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2aa0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2ab0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2ac0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2ad0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ae0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2af0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2b10: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2b20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2b30: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2b40: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2b50: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2b60: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2b70: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2b80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2b90: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2ba0: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2bb0: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2bc0: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2bd0: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2be0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2bf0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2c00: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2c10: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2c20: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2c30: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2c40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2c50: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2c60: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2c70: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2c80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2c90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2ca0: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2cb0: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2cc0: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2cd0: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ce0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2cf0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2d00: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2d10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2d20: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2d30: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2d40: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2d50: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2d60: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2d70: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2d80: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2d90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2da0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2db0: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2dc0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2dd0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2de0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2df0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2e00: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2e10: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2e20: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2e30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
2e50: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
2e60: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
2e70: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
2e80: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
2e90: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
2ea0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
2eb0: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
2ec0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
2ed0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
2ee0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
2ef0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
2f00: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
2f10: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
2f20: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
2f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2f50: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
2f60: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
2f70: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
2f80: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
2f90: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
2fa0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
2fb0: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
2fc0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
2fd0: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
2fe0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
2ff0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
3000: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
3010: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
3020: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
3030: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3040: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3050: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3060: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3070: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3080: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3090: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
30a0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
30b0: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
30c0: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
30d0: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
30e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
30f0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
3100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3110: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
3120: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
3130: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3140: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3150: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3160: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3170: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3180: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3190: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
31a0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
31b0: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
31c0: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
31d0: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
31e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
3200: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
3210: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
3220: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
3230: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3240: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3250: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3260: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3270: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3280: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3290: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
32a0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
32b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
32c0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
32d0: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
32e0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
32f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
3300: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
3310: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
3320: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
3330: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3340: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3350: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3360: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3370: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3380: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3390: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
33a0: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
33b0: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
33c0: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
33d0: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
33e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
33f0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
3400: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
3410: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
3420: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
3430: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3440: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3450: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3460: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3470: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3480: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3490: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
34a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
34b0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
34c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34d0: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
34e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
34f0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
3500: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3510: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
3520: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
3530: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3540: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3550: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3560: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3570: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3580: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3590: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
35a0: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
35b0: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
35c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35d0: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
35e0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
35f0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
3600: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
3610: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
3620: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
3630: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3640: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3650: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3660: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3680: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3690: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
36a0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
36b0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
36c0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
36d0: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
36e0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
36f0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
3700: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
3710: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
3720: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
3730: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3740: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3750: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3760: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3770: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3780: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3790: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
37a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
37b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
37c0: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
37d0: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
37e0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
37f0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
3800: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
3810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3820: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
3830: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3840: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3850: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3860: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3870: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3880: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3890: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
38a0: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
38b0: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
38c0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
38d0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
38e0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
38f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3900: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3910: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3920: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3930: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3940: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3950: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3960: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3970: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3980: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3990: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
39a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
39b0: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
39c0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
39d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
39e0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
39f0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3a00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3a10: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3a20: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3a30: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3a40: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3a50: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3a60: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3a70: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3a80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3a90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3aa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3ab0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3ac0: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3ad0: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ae0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3af0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3b00: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3b10: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3b20: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3b30: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3b40: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3b50: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3b60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3b70: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3b80: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3b90: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3ba0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3bb0: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3bc0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3bd0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3be0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3bf0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3c00: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3c10: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3c20: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3c30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3c40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3c50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3c60: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3c70: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3c80: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3c90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3ca0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3cb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3cc0: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3cd0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ce0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3cf0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3d00: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3d10: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3d20: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3d30: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3d40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3d50: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3d60: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3d70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3d80: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3d90: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3da0: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3db0: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3dc0: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3dd0: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3de0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3df0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3e00: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3e10: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3e20: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3e30: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
3e40: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
3e50: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
3e60: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e70: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
3e80: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
3e90: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
3ea0: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
3eb0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3ec0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
3ed0: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
3ee0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
3ef0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
3f00: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
3f10: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3f20: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
3f30: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
3f40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
3f50: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
3f60: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
3f70: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
3f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3f90: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
3fa0: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
3fb0: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
3fc0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
3fd0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
3fe0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
3ff0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
4000: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
4010: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
4020: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
4030: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4040: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4050: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4060: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4070: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4080: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4090: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
40a0: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
40b0: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
40c0: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
40d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40e0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40f0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
4100: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4110: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4120: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4130: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4140: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4150: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4160: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4170: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4190: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
41a0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41b0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41c0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41d0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41f0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
4200: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4210: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4220: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4230: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4240: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4250: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4260: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4270: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4280: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4290: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
42a0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42b0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42c0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42d0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42e0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42f0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
4300: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4310: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4330: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4340: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4350: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4360: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4370: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4380: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4390: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
43a0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43b0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43c0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43d0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43e0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43f0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
4400: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4410: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4420: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4430: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4440: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4450: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4460: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4470: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4490: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
44a0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44b0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44c0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44d0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44e0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44f0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
4500: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4510: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4520: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4530: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4540: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4550: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4560: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4570: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4580: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4590: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
45a0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45b0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45e0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45f0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
4600: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4610: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4620: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4630: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4640: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4650: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4660: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4670: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4680: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4690: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
46a0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46b0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46c0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46d0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46f0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4700: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4710: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4720: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4730: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4740: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4750: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4760: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4770: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4780: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4790: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
47a0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47c0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47d0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47e0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4800: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4810: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4820: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4830: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4840: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4850: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4860: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4870: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4880: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4890: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
48a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48f0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4900: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4910: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4920: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4930: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4940: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4950: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4960: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4970: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4990: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
49a0: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49b0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49d0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4a00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a10: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a20: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a30: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a40: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a50: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a60: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a70: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a80: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a90: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4aa0: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4ab0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ac0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ad0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ae0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4af0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4b00: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b10: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b20: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b30: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b40: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b50: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b60: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b70: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b80: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b90: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4ba0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4bb0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bc0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bd0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4be0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4bf0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4c00: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c10: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c20: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c40: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c50: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c60: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c70: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c80: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c90: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4ca0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cc0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cd0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ce0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4cf0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4d00: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d10: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d20: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d40: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d60: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d70: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d80: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d90: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4da0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4db0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4dc0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4de0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4df0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4e00: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e10: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e20: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e30: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e40: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e50: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e60: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e80: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e90: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4ea0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4eb0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4ec0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ed0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ee0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ef0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4f00: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f10: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f20: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f60: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f70: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f80: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f90: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4fa0: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fb0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fc0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fd0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fe0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4ff0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
5000: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5010: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5020: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5030: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5040: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5050: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5060: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5070: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5080: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5090: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
50a0: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50b0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50c0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50d0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50f0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5100: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5110: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5120: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
5130: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5140: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5160: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5170: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5180: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
51a0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
51b0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
51c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
51d0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
51f0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5200: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5210: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
5220: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
5230: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5240: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5250: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5260: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5270: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5280: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5290: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
52a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
52b0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
52c0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
52d0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
52e0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
52f0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5300: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5310: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5320: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
5330: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5340: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5350: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5360: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5370: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5380: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5390: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
53a0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
53b0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
53c0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
53d0: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
53e0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
53f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
5400: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
5410: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
5420: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
5430: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5440: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5450: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5460: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5470: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5480: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5490: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
54a0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
54b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
54c0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
54d0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
54e0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
54f0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5500: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
5510: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
5520: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
5530: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5540: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5550: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5560: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5570: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5580: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5590: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
55a0: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
55b0: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
55c0: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
55d0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
55e0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
55f0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
5600: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
5610: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5620: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5630: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5640: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5650: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5660: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5670: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5680: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5690: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
56a0: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
56b0: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
56c0: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
56d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
56e0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
56f0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
5700: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
5710: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5720: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5730: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5740: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5750: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5760: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5770: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5780: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5790: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
57a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
57b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
57c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
57d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
57e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
57f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5800: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5810: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5820: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5830: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5840: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5850: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5860: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5870: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5890: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
58a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
58b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
58c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
58d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
58e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
58f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5900: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5910: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5920: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5930: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5940: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5950: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5960: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5970: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5980: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5990: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
59a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
59b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
59c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
59d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
59e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
59f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5a00: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5a10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5a20: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5a30: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5a40: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5a50: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5a60: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5a70: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5a80: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5a90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5aa0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5ab0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5ac0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5ad0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ae0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5af0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5b00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5b10: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5b20: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5b30: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5b40: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5b60: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5b70: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5b80: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5b90: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5ba0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5bb0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5bc0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5be0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5bf0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5c00: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5c10: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5c20: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5c40: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5c50: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5c60: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5c70: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5c80: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5c90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5ca0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5cb0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5cc0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5cd0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ce0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5cf0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5d00: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5d10: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5d20: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5d30: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5d40: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5d50: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5d70: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5d80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5d90: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5db0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5dc0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5dd0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5de0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5df0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5e00: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5e10: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5e20: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5e30: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
5e40: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
5e50: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
5e60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5e70: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
5e80: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
5e90: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5ea0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
5eb0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
5ec0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
5ed0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5ee0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
5ef0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
5f00: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
5f10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
5f20: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
5f30: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
5f40: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
5f50: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
5f60: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
5f70: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
5f80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
5f90: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5fa0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5fb0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
5fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
5fd0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
5fe0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5ff0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
6000: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
6010: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
6020: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
6030: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6040: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6050: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6060: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6070: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6090: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
60a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
60b0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
60c0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
60d0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
60e0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
60f0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6100: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6110: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6120: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6130: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6140: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6150: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6160: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6170: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6180: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6190: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
61a0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
61b0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
61c0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
61d0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
61e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
61f0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6200: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
6210: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6220: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
6230: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6240: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6250: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6260: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6270: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6280: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6290: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
62a0: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
62b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62c0: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
62d0: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
62e0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
62f0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
6300: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6310: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6330: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6340: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6350: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6360: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6370: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6380: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6390: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
63a0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
63b0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
63c0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
63d0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
63e0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
63f0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6410: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6420: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6430: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6440: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6450: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6460: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6470: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6480: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6490: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
64a0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
64b0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
64c0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
64d0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
64e0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
64f0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6500: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6510: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6520: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6530: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6540: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6550: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6560: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6570: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6580: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6590: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
65a0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
65b0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
65c0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
65d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
65e0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
65f0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6600: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6610: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6620: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6630: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6640: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6650: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6660: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6670: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6680: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6690: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
66a0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
66b0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
66c0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
66d0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
66e0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6700: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6710: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6720: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6730: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6740: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6750: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6760: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6770: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6780: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6790: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
67a0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
67b0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
67c0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
67d0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
67e0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
67f0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6800: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6810: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6820: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6830: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6840: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6850: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6860: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6870: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6880: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6890: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
68a0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
68b0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
68c0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
68d0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
68e0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
68f0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6900: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6910: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6920: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6930: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6940: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6950: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6960: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6970: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6980: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
69a0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
69b0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
69c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
69d0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
69e0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
69f0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6a00: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6a10: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6a30: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6a40: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6a50: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6a60: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6a70: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6a80: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6aa0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6ab0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ac0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6ad0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ae0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6af0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6b00: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6b10: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6b20: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6b40: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6b50: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6b60: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6b70: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6b80: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6b90: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6ba0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6bb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6bc0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6bd0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6be0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6bf0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6c00: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6c10: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6c20: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6c30: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6c40: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6c50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6c60: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6c70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6c80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6c90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6ca0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6cb0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6cc0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6cd0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ce0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6cf0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6d00: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6d10: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6d20: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6d30: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6d40: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6d50: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6d60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6d80: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6dc0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6dd0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6de0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6df0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6e00: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6e10: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6e20: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6e30: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6e40: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6e50: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6e60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6e70: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6e80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6e90: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6ea0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6eb0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6ec0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6ed0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6f00: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6f10: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
6f20: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
6f30: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6f40: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
6f50: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
6f60: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6f70: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
6f80: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
6f90: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6fa0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
6fb0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6fc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
6fd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6fe0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7000: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7010: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7020: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7030: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7040: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7050: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7060: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7080: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7090: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
70a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
70b0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
70c0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
70d0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
70e0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
70f0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7100: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7110: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7120: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7130: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7140: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7150: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7160: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7170: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7180: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7190: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
71a0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
71d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
71e0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
71f0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7200: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7210: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7220: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7230: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7240: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7250: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7260: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7270: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7280: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7290: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
72a0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
72b0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
72c0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
72d0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
72e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
72f0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7300: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7310: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7320: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7330: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7340: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7350: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7380: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7390: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
73a0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
73b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
73c0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
73d0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
73e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
73f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7400: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7410: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7420: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7430: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7440: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7450: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7460: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7470: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7480: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7490: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
74a0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
74b0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
74c0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
74d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
74e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
74f0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7500: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7510: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7520: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7530: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7540: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7550: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7560: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7570: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7580: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7590: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
75a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
75b0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
75c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
75d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
75e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
75f0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7600: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7610: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7620: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7630: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7640: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7650: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7660: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7670: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7680: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7690: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
76a0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
76b0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
76c0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
76d0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
76e0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
76f0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7700: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7710: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7720: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7730: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7740: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7750: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7760: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7770: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7780: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7790: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
77a0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
77b0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
77c0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
77d0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
77e0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
77f0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
7800: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
7810: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7820: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7830: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7840: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7850: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7870: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7890: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
78a0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
78b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
78c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78d0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
78e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
78f0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7900: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7910: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7920: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7930: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7940: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7950: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7960: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7970: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7980: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7990: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
79a0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
79c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
79d0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
79e0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
79f0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7a00: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7a10: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7a20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7a30: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7a40: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7a50: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7a60: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7a70: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7a80: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7a90: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7aa0: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7ab0: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ac0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7ad0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ae0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7af0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7b00: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7b10: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7b20: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7b30: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7b40: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7b50: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7b60: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7ba0: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7bb0: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7bc0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7bd0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7be0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7bf0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7c00: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7c10: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7c20: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7c30: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7c40: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7c50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7c60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7c70: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7c80: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7c90: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7ca0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7cb0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7cc0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7cd0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ce0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7cf0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7d00: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7d10: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7d20: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7d30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7d40: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7d50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7d60: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7d70: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7d80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7d90: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7da0: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7db0: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7dc0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7dd0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7de0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7e00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7e10: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7e20: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7e30: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7e40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7e50: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7e70: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7e80: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7e90: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7eb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7ec0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7ee0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7ef0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7f10: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7f20: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7f30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7f40: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
7f50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7f60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
7f70: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
7f80: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
7f90: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
7fa0: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
7fb0: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
7fc0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
7fd0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
7fe0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
7ff0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
8000: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8010: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8020: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8030: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8040: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8050: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8060: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8070: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8080: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8090: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
80a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
80b0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
80c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
80d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
80e0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
80f0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
8100: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8110: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8120: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8130: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8140: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8150: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8160: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8170: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8180: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8190: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
81a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
81b0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
81c0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
81d0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
81e0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
81f0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
8200: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
8210: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8220: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8230: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8240: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8250: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8260: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8270: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8280: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8290: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
82a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
82b0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
82c0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
82d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
82e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
82f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
8300: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8310: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8320: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8330: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8340: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8350: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8360: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8370: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8380: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8390: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
83a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
83b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
83c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
83d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
83e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
83f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
8400: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8410: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8420: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8430: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8440: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8450: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8460: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8470: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8480: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8490: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
84a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
84b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
84c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
84d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
84e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
84f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
8500: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8510: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8520: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8530: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8540: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8550: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8560: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8570: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8580: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8590: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
85a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
85b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
85c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
85d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
85e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
85f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8600: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8610: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8620: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8630: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8640: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8660: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8670: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8680: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8690: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
86a0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
86b0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
86c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
86d0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
86e0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
86f0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8700: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8710: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8720: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8730: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8740: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8750: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8760: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8770: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8780: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
87a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
87c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
87d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
87e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
87f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
8800: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
8810: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8820: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8830: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8840: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8850: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8860: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8870: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8880: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8890: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
88a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
88b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
88c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
88d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
88e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
88f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8900: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8910: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8920: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8930: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8940: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8950: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8960: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8970: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8980: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8990: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
89a0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
89b0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
89c0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
89d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
89e0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
89f0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8a00: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8a10: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8a40: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8a50: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8a90: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8aa0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8ab0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ac0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8ad0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ae0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8af0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8b00: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8b10: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8b20: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8b30: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8b40: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8b50: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8b60: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8b70: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8b80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8b90: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8ba0: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8bb0: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8bc0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8bd0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8be0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8bf0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8c00: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8c10: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8c20: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8c30: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8c40: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8c50: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8c60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8c70: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8c80: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8c90: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8ca0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8cb0: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8cc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8cd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ce0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8cf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8d00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8d10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8d20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8d30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8d40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8d50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8d60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8d70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8d80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8d90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8da0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8db0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8dc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8dd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8de0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8df0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8e00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8e10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8e20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8e30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8e40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8e50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8e60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8e70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8e80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8ea0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8eb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8ec0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8ed0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8ee0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8ef0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8f00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8f10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8f20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
8f30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
8f50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8f60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8f70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8f80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8f90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8fa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8fb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8fc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8fd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8fe0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8ff0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
9010: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9020: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9030: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9040: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9050: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9060: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9070: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9080: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9090: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
90a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
90b0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
90c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
90d0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
90e0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
90f0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
9100: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
9110: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9120: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9130: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9140: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9150: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9160: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9170: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9180: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9190: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
91a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
91b0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
91c0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
91d0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
91e0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
91f0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
9200: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
9210: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9220: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9230: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9240: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9250: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9260: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9270: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9280: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9290: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
92a0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
92b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
92c0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
92d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
92e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
92f0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
9300: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
9310: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9320: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9330: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9340: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9350: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9360: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9370: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9380: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9390: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
93a0: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
93b0: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
93c0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
93d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
93e0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
93f0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
9400: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
9410: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9420: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9430: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9440: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9450: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9460: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9470: 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45  ..**.** EVIDENCE
9480: 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31  -OF: R-44582-601
9490: 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72  38 SQLite may fr
94a0: 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20  om time to time 
94b0: 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20  reorganize a.** 
94c0: 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74  b-tree page so t
94d0: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
94e0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66   freeblocks or f
94f0: 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61  ragment bytes, a
9500: 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74  ll.** unused byt
9510: 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  es are contained
9520: 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61   in the unalloca
9530: 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e  ted space region
9540: 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c  , and all.** cel
9550: 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69  ls are packed ti
9560: 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64  ghtly at the end
9570: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
9580: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
9590: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
95a0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
95b0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
95c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
95d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
95e0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
95f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
9600: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
9610: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
9620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9630: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9640: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
9650: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
9680: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
9690: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
96a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
96b0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
96c0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
96d0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
96e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
96f0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
9700: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
9710: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9730: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
9740: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9750: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
9780: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
9790: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
97a0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
97b0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
97c0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
97d0: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
97e0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
97f0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
9800: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9810: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
9820: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
9830: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
9840: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
9850: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
9860: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
9870: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
9880: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9890: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
98a0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
98b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
98c0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
98d0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
98e0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
98f0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
9900: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9910: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9920: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
9930: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
9950: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9960: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9970: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9980: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9990: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
99a0: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
99b0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
99c0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
99d0: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
99e0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
99f0: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
9a00: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9a10: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
9a20: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9a30: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
9a40: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
9a50: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
9a60: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
9a70: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
9a80: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
9a90: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
9aa0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
9ab0: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
9ac0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
9ad0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
9ae0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
9af0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
9b00: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
9b10: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
9b20: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
9b30: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
9b40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9b50: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
9b60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9b70: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23  ==iCellLast );.#
9b80: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9b90: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9ba0: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9bb0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
9bc0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
9bd0: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
9be0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
9bf0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
9c00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9c10: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9c20: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
9c30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9c40: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9c50: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9c60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9c70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9c80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9c90: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
9ca0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
9cb0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
9cc0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
9cd0: 72 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  r(pPage, &src[pc
9ce0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9cf0: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9d00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9d10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9d20: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
9d30: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
9d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9d50: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9d60: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
9d70: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
9d80: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9d90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9da0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9db0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9dc0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9dd0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9de0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9df0: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9e00: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9e10: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9e20: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
9e40: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
9e50: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9e60: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9e70: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
9e80: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
9e90: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
9ea0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9eb0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
9ec0: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
9ed0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
9ee0: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
9ef0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9f00: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
9f10: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
9f20: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
9f30: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
9f40: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
9f50: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
9f60: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
9f70: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
9f80: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
9f90: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
9fa0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
9fb0: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
9fc0: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
9fd0: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
9fe0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
9ff0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
a000: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
a010: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
a020: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
a030: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a040: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a050: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
a060: 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ( cbrk-iCellFirs
a070: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
a080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a090: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a0a0: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
a0b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a0c0: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
a0d0: 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65  ree-list on page
a0e0: 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74   pPg for space t
a0f0: 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e  o store a cell n
a100: 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a  Byte bytes in.**
a110: 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61   size. If one ca
a120: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
a130: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
a140: 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65  the space and re
a150: 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20  move it.** from 
a160: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
a170: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  *.** If no suita
a180: 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65  ble space can be
a190: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72   found on the fr
a1a0: 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20  ee-list, return 
a1b0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
a1c0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65   function may de
a1d0: 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20  tect corruption 
a1e0: 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20  within pPg.  If 
a1f0: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a  corruption is.**
a200: 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a   detected then *
a210: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
a220: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
a230: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a240: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 6c  d..**.** If a sl
a250: 6f 74 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  ot of at least n
a260: 42 79 74 65 20 62 79 74 65 73 20 69 73 20 66 6f  Byte bytes is fo
a270: 75 6e 64 20 62 75 74 20 63 61 6e 6e 6f 74 20 62  und but cannot b
a280: 65 20 75 73 65 64 20 62 65 63 61 75 73 65 20 0a  e used because .
a290: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  ** there are alr
a2a0: 65 61 64 79 20 61 74 20 6c 65 61 73 74 20 36 30  eady at least 60
a2b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a2c0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 72  s on the page, r
a2d0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  eturn NULL..** I
a2e0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20  n this case, if 
a2f0: 70 62 44 65 66 72 61 67 20 70 61 72 61 6d 65 74  pbDefrag paramet
a300: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
a310: 73 65 74 20 2a 70 62 44 65 66 72 61 67 20 74 6f  set *pbDefrag to
a320: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
a330: 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f   u8 *pageFindSlo
a340: 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20  t(MemPage *pPg, 
a350: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
a360: 70 52 63 2c 20 69 6e 74 20 2a 70 62 44 65 66 72  pRc, int *pbDefr
a370: 61 67 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ag){.  const int
a380: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
a390: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
a3a0: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
a3b0: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
a3c0: 64 64 72 3b 0a 20 20 69 6e 74 20 70 63 3b 0a 20  ddr;.  int pc;. 
a3d0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
a3e0: 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
a3f0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69  leSize;..  for(i
a400: 41 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  Addr=hdr+1; (pc 
a410: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
a420: 61 5b 69 41 64 64 72 5d 29 29 3e 30 3b 20 69 41  a[iAddr]))>0; iA
a430: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 69 6e 74  ddr=pc){.    int
a440: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a450: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a460: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
a470: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
a480: 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20  : R-06866-39125 
a490: 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61  Freeblocks are a
a4a0: 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20  lways connected 
a4b0: 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20  in order of.    
a4c0: 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66  ** increasing of
a4d0: 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  fset. */.    if(
a4e0: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
a4f0: 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29   || pc<iAddr+4 )
a500: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
a510: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a520: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
a530: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   0;.    }.    /*
a540: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a550: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
a560: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
a570: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
a580: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
a590: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
a5a0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a5b0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
a5c0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
a5d0: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
a5e0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
a5f0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
a600: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
a610: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
a620: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e  .    if( size>=n
a630: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Byte ){.      in
a640: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
a650: 74 65 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  te;.      testca
a660: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
a670: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
a680: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c   );.      if( x<
a690: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
a6a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
a6b0: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
a6c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
a6d0: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
a6e0: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
a6f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a700: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
a710: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
a720: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
a730: 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29 7b  ta[hdr+7]>=60 ){
a740: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
a750: 62 44 65 66 72 61 67 20 29 20 2a 70 62 44 65 66  bDefrag ) *pbDef
a760: 72 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rag = 1;.       
a770: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
a790: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
a7a0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
a7b0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
a7c0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
a7d0: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
a7e0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
a7f0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
a800: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
a810: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
a820: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
a830: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
a840: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
a850: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
a860: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
a870: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
a880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a890: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
a8a0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
a8b0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
a8c0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
a8d0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
a8e0: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
a8f0: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
a900: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
a910: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
a920: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
a930: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
a940: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
a950: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
a960: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
a970: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
a980: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a990: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
a9a0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
a9b0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
a9c0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
a9d0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
a9e0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
a9f0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
aa00: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
aa10: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
aa20: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
aa30: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
aa40: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
aa50: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
aa60: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
aa70: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
aa80: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
aa90: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
aaa0: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
aab0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
aac0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
aad0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
aae0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
aaf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
ab00: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
ab10: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
ab20: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
ab30: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
ab40: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
ab50: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
ab60: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
ab70: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
ab80: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
ab90: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
aba0: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
abb0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
abc0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
abd0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
abe0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
abf0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
ac00: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
ac10: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
ac20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
ac30: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
ac40: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ac50: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
ac60: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
ac70: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
ac80: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
ac90: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
aca0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
acb0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
acc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
acd0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
ace0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
acf0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
ad00: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ad30: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
ad40: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
ad50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
ad80: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
ad90: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
ada0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
adb0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
adc0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
add0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
ade0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
adf0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
ae00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ae10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ae20: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
ae30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ae40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ae50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
ae60: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
ae70: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
ae80: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
ae90: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
aea0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
aeb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
aec0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
aed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
aee0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
aef0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
af00: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
af10: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
af20: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
af30: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
af40: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
af50: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
af60: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
af70: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
af80: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
af90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
afa0: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
afb0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
afc0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
afd0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
afe0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
aff0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
b000: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
b010: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
b020: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
b030: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
b040: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
b050: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
b060: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
b070: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
b080: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
b090: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
b0a0: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
b0b0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
b0c0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
b0d0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
b0e0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
b0f0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
b100: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
b110: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
b120: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b130: 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 49 66  T_BKPT;..  /* If
b140: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
b150: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
b160: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
b170: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
b180: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
b190: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
b1a0: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
b1b0: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
b1c0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
b1d0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
b1e0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
b1f0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
b200: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
b210: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
b220: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
b230: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
b240: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
b250: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
b260: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
b270: 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20 28 64  gap+2<=top && (d
b280: 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20 64 61  ata[hdr+1] || da
b290: 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a 20 20  ta[hdr+2]) ){.  
b2a0: 20 20 69 6e 74 20 62 44 65 66 72 61 67 20 3d 20    int bDefrag = 
b2b0: 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63  0;.    u8 *pSpac
b2c0: 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  e = pageFindSlot
b2d0: 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26  (pPage, nByte, &
b2e0: 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b 0a 20  rc, &bDefrag);. 
b2f0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b300: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 62  rn rc;.    if( b
b310: 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20 64 65  Defrag ) goto de
b320: 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20  fragment_page;. 
b330: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
b340: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b350: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
b360: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
b370: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
b380: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
b390: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
b3a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b3b0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
b3c0: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
b3d0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c  could not be ful
b3e0: 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66  filled using a f
b3f0: 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43  reelist slot.  C
b400: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
b410: 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74   if defragmentat
b420: 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
b430: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
b440: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
b450: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
b460: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
b470: 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65   defragment_page
b480: 3a 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  :.    testcase( 
b490: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
b4a0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
b4b0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
b4c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
b4d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
b4e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b4f0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b500: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
b510: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
b520: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
b530: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
b540: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
b550: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
b560: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
b570: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
b580: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
b590: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
b5a0: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
b5b0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
b5c0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
b5d0: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
b5e0: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
b5f0: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
b600: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
b610: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
b620: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
b630: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
b640: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
b650: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
b660: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
b670: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
b680: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
b690: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b6a0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
b6b0: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
b6c0: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
b6d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
b6e0: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
b6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b700: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
b710: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
b720: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
b730: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
b740: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
b750: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
b760: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
b770: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
b780: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
b790: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
b7a0: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
b7b0: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
b7c0: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
b7d0: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
b7e0: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
b7f0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
b800: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
b810: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
b820: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
b830: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
b840: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
b850: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
b860: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
b870: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
b880: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
b890: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
b8a0: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
b8b0: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
b8c0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b8d0: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
b8e0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
b8f0: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
b900: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
b910: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
b920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
b930: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
b940: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
b950: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
b960: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b970: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
b980: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
b990: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
b9c0: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
b9d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
b9e0: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
ba10: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
ba20: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ba50: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
ba60: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
ba70: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
baa0: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
bab0: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
bac0: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bae0: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
baf0: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
bb00: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
bb10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bb20: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
bb30: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
bb40: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
bb50: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
bb60: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
bb70: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
bb80: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
bb90: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
bba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
bbb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
bbc0: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
bbd0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
bbe0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
bbf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
bc00: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
bc10: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
bc20: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
bc30: 74 28 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  t( iStart>=pPage
bc40: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
bc50: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
bc60: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
bc70: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
bc80: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
bc90: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
bca0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bcb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
bcc0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
bcd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
bce0: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
bcf0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
bd00: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
bd10: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
bd20: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
bd30: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
bd40: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
bd50: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
bd60: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
bd70: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
bd80: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
bd90: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
bda0: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
bdb0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
bdc0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
bdd0: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
bde0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
bdf0: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
be00: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
be10: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
be20: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
be30: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
be40: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
be50: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
be60: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
be70: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
be80: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
be90: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
bea0: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
beb0: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
bec0: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
bed0: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
bee0: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
bef0: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
bf00: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
bf10: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
bf20: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
bf30: 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c  ]))>0 && iFreeBl
bf40: 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  k<iStart ){.    
bf50: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
bf60: 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53  Ptr+4 ) return S
bf70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bf80: 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d  PT;.      iPtr =
bf90: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
bfa0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
bfb0: 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e  k>iLast ) return
bfc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bfd0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
bfe0: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
bff0: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
c000: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
c010: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
c020: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
c030: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
c040: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
c050: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
c060: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
c070: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
c080: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 69 46   of a pointer iF
c090: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
c0a0: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
c0b0: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
c0c0: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
c0d0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
c0e0: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
c0f0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
c100: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
c110: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
c120: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
c130: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
c140: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
c150: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c160: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c170: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
c180: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
c190: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
c1a0: 29 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  );.      iSize =
c1b0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
c1c0: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
c1d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c1e0: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
c1f0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
c200: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
c210: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
c220: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
c230: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
c240: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
c250: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
c260: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
c270: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
c280: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
c290: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
c2a0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
c2b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
c2c0: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
c2d0: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
c2e0: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
c2f0: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
c300: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
c310: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
c320: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
c330: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
c340: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c350: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
c360: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
c370: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
c380: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
c390: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
c3a0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
c3b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c3c0: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
c3d0: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
c3e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c3f0: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
c400: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
c410: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
c420: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
c430: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
c440: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
c450: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
c460: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
c470: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c480: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
c490: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
c4a0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
c4b0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
c4c0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
c4d0: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
c4e0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
c4f0: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
c500: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c510: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
c520: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
c530: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
c540: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c550: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
c560: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
c570: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
c580: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
c590: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
c5a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
c5b0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
c5c0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c5d0: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
c5e0: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
c5f0: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
c600: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
c610: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
c620: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
c630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c640: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
c650: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
c660: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c670: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
c680: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
c690: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
c6a0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
c6b0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
c6c0: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
c6d0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
c6e0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
c6f0: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
c700: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
c710: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
c720: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
c730: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
c740: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
c750: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
c760: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
c770: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
c780: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c790: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
c7a0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
c7b0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
c7c0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
c7d0: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
c7e0: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
c7f0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
c800: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
c810: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
c820: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
c830: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
c840: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
c850: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
c860: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
c870: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c880: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c890: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c8a0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
c8b0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
c8c0: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
c8d0: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
c8e0: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
c8f0: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
c900: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
c910: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
c920: 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  f;.  pBt = pPage
c930: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
c940: 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
c950: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c960: 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  Y) ){.    /* EVI
c970: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34  DENCE-OF: R-0364
c980: 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65 20  0-13415 A value 
c990: 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70  of 5 means the p
c9a0: 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69  age is an interi
c9b0: 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  or.    ** table 
c9c0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
c9d0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
c9e0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
c9f0: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
ca00: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ca10: 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41 20  R-20501-61796 A 
ca20: 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e  value of 13 mean
ca30: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
ca40: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c  leaf.    ** tabl
ca50: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
ca60: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
ca70: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
ca80: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
ca90: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
caa0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
cab0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
cac0: 4c 65 61 66 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Leaf = pPage->le
cad0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  af;.    pPage->n
cae0: 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70 50 61 67  oPayload = !pPag
caf0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
cb00: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
cb10: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
cb20: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
cb30: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
cb40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
cb50: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
cb60: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
cb70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
cb80: 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65  25-53936 A value
cb90: 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20   of 2 means the 
cba0: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
cbb0: 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ior.    ** index
cbc0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
cbe0: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
cbf0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
cc00: 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31  E-OF: R-16571-11
cc10: 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31  615 A value of 1
cc20: 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  0 means the page
cc30: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
cc40: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
cc50: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
cc60: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
cc70: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
cc80: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cc90: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
cca0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
ccb0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ccc0: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
ccd0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
cce0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
ccf0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
cd00: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
cd10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
cd20: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cd30: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
cd40: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
cd50: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
cd60: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
cd70: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
cd80: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
cd90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
cda0: 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  PT;.  }.  pPage-
cdb0: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
cdc0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
cdd0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
cde0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cdf0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
ce00: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
ce10: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
ce20: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
ce30: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
ce40: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
ce50: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
ce60: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
ce70: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
ce80: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
ce90: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
cea0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
ceb0: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
cec0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
ced0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
cee0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
cef0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
cf00: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
cf10: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
cf20: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
cf30: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
cf40: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
cf50: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
cf60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
cf70: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
cf80: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
cf90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
cfa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cfb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cfc0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
cfd0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
cfe0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
cff0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
d000: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d010: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
d020: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d030: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d050: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
d060: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
d070: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d080: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
d090: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d0a0: 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20  u16 pc;         
d0b0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d0c0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
d0d0: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
d0e0: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72  [] */.    u8 hdr
d0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d100: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
d110: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
d120: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
d130: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
d140: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
d150: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
d160: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
d170: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
d180: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
d190: 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  /.    int usable
d1a0: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
d1b0: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
d1c0: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
d1d0: 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  */.    u16 cellO
d1e0: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
d1f0: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
d200: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
d210: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
d220: 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
d230: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d240: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
d250: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
d260: 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20      int top;    
d270: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d280: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
d290: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
d2a0: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  .    int iCellFi
d2b0: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
d2c0: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
d2d0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
d2e0: 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  set */.    int i
d2f0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
d300: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
d310: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
d320: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20   offset */..    
d330: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
d340: 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  ;..    hdr = pPa
d350: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d360: 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
d370: 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45  >aData;.    /* E
d380: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
d390: 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e  594-02890 The on
d3a0: 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f  e-byte flag at o
d3b0: 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69  ffset 0 indicati
d3c0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d  ng.    ** the b-
d3d0: 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20  tree page type. 
d3e0: 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  */.    if( decod
d3f0: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
d400: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
d410: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d420: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
d430: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
d440: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
d450: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
d460: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
d470: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
d480: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
d490: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
d4a0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
d4b0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
d4c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
d4d0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
d4e0: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
d4f0: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
d500: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
d510: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
d520: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61  aEnd = &data[usa
d530: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50  bleSize];.    pP
d540: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
d550: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
d560: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
d570: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
d580: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
d590: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
d5a0: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
d5b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
d5c0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
d5d0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
d5e0: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
d5f0: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
d600: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
d610: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
d620: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
d630: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
d640: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
d660: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
d670: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d680: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
d690: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
d6a0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
d6b0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
d6c0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
d6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d6e0: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
d6f0: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
d700: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
d710: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
d720: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
d730: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
d740: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
d750: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d760: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d770: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
d780: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
d790: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
d7a0: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
d7b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
d7c0: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
d7d0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
d7e0: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
d7f0: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
d800: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
d810: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
d820: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
d830: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
d840: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
d850: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
d860: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
d870: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
d880: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
d890: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
d8a0: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
d8b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
d8c0: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
d8d0: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
d8e0: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
d8f0: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
d900: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
d910: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
d920: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
d930: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
d940: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
d950: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
d960: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d970: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
d980: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
d990: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
d9a0: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
d9b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
d9c0: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
d9d0: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
d9e0: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
d9f0: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
da00: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
da10: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
da20: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
da30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
da40: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
da50: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
da60: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
da70: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
da80: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
da90: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
daa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dab0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
dac0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
dad0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
daf0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
db00: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
db10: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
db20: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
db30: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
db40: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
db50: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
db60: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
db70: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
db80: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
db90: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
dba0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
dbb0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
dbc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
dbd0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
dbe0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
dbf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
dc00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
dc10: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
dc20: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
dc30: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
dc40: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
dc50: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
dc60: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
dc70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
dc80: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
dc90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dca0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dcc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
dcd0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
dce0: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
dcf0: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
dd00: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
dd10: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
dd20: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  ce on the page. 
dd30: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
dd40: 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
dd50: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
dd60: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
dd70: 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  1 gives the.    
dd80: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
dd90: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
dda0: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
ddb0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
ddc0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66   are no.    ** f
ddd0: 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
dde0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
ddf0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
de00: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
de10: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
de20: 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
de30: 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
de40: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ee space */.    
de50: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
de60: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
de70: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
de80: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
de90: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
dea0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
deb0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
dec0: 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
ded0: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
dee0: 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
def0: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
df00: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
df10: 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
df20: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
df30: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
df40: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20       ** Or, the 
df50: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66  freeblock is off
df60: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
df70: 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  page.        */.
df80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
df90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
dfa0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
dfb0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
dfc0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
dfd0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
dfe0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
dff0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
e000: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
e010: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
e020: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
e030: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
e040: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
e050: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
e060: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
e070: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
e080: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
e090: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
e0a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
e0b0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
e0c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e0d0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
e0e0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
e0f0: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
e100: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
e110: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
e120: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
e130: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
e140: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
e150: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
e160: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
e170: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
e180: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
e190: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
e1a0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
e1b0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
e1c0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
e1d0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
e1e0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
e1f0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
e200: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
e210: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
e220: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
e230: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
e240: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
e250: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
e260: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
e270: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
e280: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
e290: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
e2a0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
e2b0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
e2c0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
e2d0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
e2e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e2f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
e300: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e310: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
e320: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
e330: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
e340: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
e350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e360: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
e370: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
e380: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
e390: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
e3a0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
e3b0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
e3c0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
e3d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
e3e0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
e3f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e400: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
e410: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
e420: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
e430: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
e440: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e450: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
e460: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
e470: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
e480: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
e490: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
e4a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e4b0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
e4c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
e4d0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
e4e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e4f0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
e500: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
e510: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
e520: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e530: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e540: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e550: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
e570: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
e580: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
e590: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
e5a0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
e5b0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
e5c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e5d0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
e5e0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
e5f0: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
e600: 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
e610: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
e620: 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
e630: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
e640: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
e650: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
e660: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
e670: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
e680: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
e690: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
e6a0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
e6b0: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
e6c0: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
e6d0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
e6e0: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
e6f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
e700: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
e710: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
e720: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
e730: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
e740: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
e750: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
e760: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
e770: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
e780: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
e790: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
e7a0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
e7b0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
e7c0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
e7d0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
e7e0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
e7f0: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
e800: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
e810: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
e820: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
e830: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
e840: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
e850: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
e860: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
e870: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
e880: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
e890: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
e8a0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
e8b0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
e8c0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
e8d0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
e8e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e8f0: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
e900: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
e910: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
e920: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
e930: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
e940: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
e950: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
e960: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
e970: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
e980: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
e990: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
e9a0: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
e9b0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
e9c0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
e9d0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
e9e0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
e9f0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
ea00: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
ea10: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
ea20: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
ea30: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
ea40: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
ea50: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
ea60: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
ea70: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
ea80: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
ea90: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
eaa0: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
eab0: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
eac0: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
ead0: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
eae0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
eaf0: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
eb00: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
eb10: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
eb20: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
eb30: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
eb40: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
eb50: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
eb60: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
eb70: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
eb80: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
eb90: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
eba0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
ebb0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
ebc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ebd0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
ebe0: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
ebf0: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
ec00: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
ec10: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
ec20: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ec40: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
ec50: 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
ec60: 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
ec70: 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
ec80: 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
ec90: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
eca0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
ecb0: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
ecc0: 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
ecd0: 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
ece0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ecf0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
ed00: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
ed10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
ed20: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
ed30: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
ed40: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
ed50: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
ed60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
ed70: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
ed80: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
ed90: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
eda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
edb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
edc0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
edd0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
ede0: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
edf0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
ee00: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
ee10: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
ee20: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
ee30: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
ee40: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
ee50: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
ee60: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
ee70: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
ee80: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
ee90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
eea0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
eeb0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
eec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eed0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
eee0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
eef0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
ef00: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
ef10: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ef20: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
ef30: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
ef40: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
ef50: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ef60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ef70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ef80: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
ef90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
efa0: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
efb0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
efc0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
efd0: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
efe0: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
eff0: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
f000: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
f010: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
f020: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
f030: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
f040: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
f050: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f060: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
f070: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
f080: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
f090: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
f0a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
f0b0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
f0c0: 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
f0d0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
f0e0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
f0f0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
f100: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
f110: 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63   a.** convenienc
f120: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
f130: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
f140: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 28  to btreeGetPage(
f150: 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49  ) and .** btreeI
f160: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
f170: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f180: 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61  urs, then the va
f190: 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20 73  lue *ppPage is s
f1a0: 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e  et to is undefin
f1b0: 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
f1c0: 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
f1d0: 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
f1e0: 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
f1f0: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
f200: 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
f210: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
f220: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
f230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
f240: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
f250: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
f280: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
f290: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
f2a0: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
f2b0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
f2c0: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
f2d0: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f   */.  int bReado
f2e0: 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
f2f0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
f300: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72 20 30  ET_READONLY or 0
f310: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f320: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f330: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
f340: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
f350: 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e 6c 79  ssert( bReadonly
f360: 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ==PAGER_GET_READ
f370: 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f 6e 6c  ONLY || bReadonl
f380: 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  y==0 );..  if( p
f390: 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
f3a0: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
f3b0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
f3c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
f3d0: 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
f3e0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
f3f0: 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65 61 64  o, ppPage, bRead
f400: 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72  only);.    if( r
f410: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f420: 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
f430: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
f440: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
f450: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
f460: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f470: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
f480: 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
f490: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
f4a0: 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  }.  }..  testcas
f4b0: 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
f4c0: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
f4d0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
f4e0: 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
f4f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
f500: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
f510: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
f520: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
f530: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
f540: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74  call to btreeGet
f550: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
f560: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
f570: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
f580: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
f590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f5a0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
f5b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f5c0: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
f5d0: 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
f5e0: 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e!=0 );.    asse
f5f0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
f600: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
f610: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
f620: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
f630: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f640: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
f650: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
f660: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
f670: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f680: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
f690: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
f6a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
f6b0: 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
f6c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
f6d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
f6e0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
f6f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
f700: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
f710: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
f720: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
f730: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
f740: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
f750: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
f760: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
f770: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
f780: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
f790: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
f7a0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
f7b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
f7c0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
f7d0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
f7e0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
f7f0: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
f800: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
f810: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
f820: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
f830: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
f840: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
f850: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
f860: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
f870: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
f880: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
f890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f8a0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
f8b0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
f8c0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
f8d0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f8e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f8f0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f900: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
f910: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
f920: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
f930: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
f940: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
f950: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
f960: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
f970: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
f980: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
f990: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
f9a0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
f9b0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
f9c0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
f9d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
f9e0: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
f9f0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
fa00: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
fa10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
fa20: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
fa30: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
fa40: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
fa50: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
fa60: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
fa70: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
fa80: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
fa90: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
faa0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
fab0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
fac0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
fad0: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
fae0: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
faf0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
fb00: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
fb10: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
fb20: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
fb30: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
fb40: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
fb50: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
fb60: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
fb70: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
fb80: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
fb90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
fba0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
fbb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fbc0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
fbd0: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
fbe0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
fbf0: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
fc00: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
fc10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
fc20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
fc30: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
fc40: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
fc50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fc60: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
fc70: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
fc80: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
fc90: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
fca0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
fcb0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
fcc0: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
fcd0: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
fce0: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
fcf0: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
fd00: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
fd10: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
fd20: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
fd30: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
fd40: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
fd50: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
fd60: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
fd70: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
fd80: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
fd90: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
fda0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
fdb0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
fdc0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
fdd0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
fde0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
fdf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
fe00: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
fe10: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
fe20: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
fe30: 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45  ts like.** BTREE
fe40: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
fe50: 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52  d/or BTREE_MEMOR
fe60: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
fe70: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
fe80: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
fe90: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
fea0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
feb0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
fec0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
fed0: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
fee0: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
fef0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
ff00: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
ff10: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
ff20: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
ff30: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
ff40: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
ff50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
ff60: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
ff70: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
ff80: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
ff90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ffa0: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
ffb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
ffc0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
ffd0: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
ffe0: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
fff0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
10000 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
10010 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
10020 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
10030 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
10040 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
10050 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
10060 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
10070 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
10080 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
10090 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
100a0 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
100b0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
100c0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
100d0 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
100e0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
100f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
10100 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
10110 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
10120 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
10130 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10140 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10150 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
10160 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
10170 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
10180 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10190 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
101a0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
101b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
101c0 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
101d0 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
101e0 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
101f0 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
10200 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10210 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
10220 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
10230 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
10240 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
10250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10260 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
10270 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
10280 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
10290 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
102a0 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
102b0 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
102c0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
102d0 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
102e0 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
102f0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
10300 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
10310 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
10320 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
10330 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
10340 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
10350 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
10360 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
10370 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
10380 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
10390 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
103a0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
103b0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
103c0 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
103d0 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
103e0 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
103f0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
10400 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
10410 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
10420 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
10450 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
10460 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20  pInMemory(db)). 
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61        || (vfsFla
10490 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
104a0 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
104b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
104c0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
104d0 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61  ( pVfs!=0 );.  a
104e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
104f0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
10500 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10510 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d  ( (flags&0xff)==
10520 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c  flags );   /* fl
10530 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74  ags fit in 8 bit
10540 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  s */..  /* Only 
10550 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  a BTREE_SINGLE d
10560 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42  atabase can be B
10570 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a  TREE_UNORDERED *
10580 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
10590 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44  gs & BTREE_UNORD
105a0 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61  ERED)==0 || (fla
105b0 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
105c0 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  E)!=0 );..  /* A
105d0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
105e0 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73  tabase is always
105f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64   a temporary and
10600 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f  /or ephemeral */
10610 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
10620 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
10630 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62  )==0 || isTempDb
10640 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d   );..  if( isMem
10650 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
10660 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
10670 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
10680 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
10690 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
106a0 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
106b0 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
106c0 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
106d0 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
106e0 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
106f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
10700 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  B;.  }.  p = sql
10710 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
10720 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
10730 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
10740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10750 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
10760 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
10770 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
10780 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10790 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
107a0 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
107b0 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
107c0 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
107d0 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
107e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
107f0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
10800 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10810 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
10820 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
10830 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
10840 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
10850 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
10860 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
10870 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
10880 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
10890 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
108a0 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
108b0 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
108c0 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
108d0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
108e0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
108f0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10900 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
10910 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
10920 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
10930 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
10940 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
10950 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
10960 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
10970 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
10980 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10990 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
109a0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
109b0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
109c0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
109d0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
109e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
109f0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
10a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10a10 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
10a20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
10a30 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
10a40 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
10a50 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
10a60 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
10a70 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20  name)+1);.      
10a80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
10a90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
10aa0 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
10ab0 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
10ae0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
10af0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
10b00 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
10b10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10b20 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
10b30 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
10b40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
10b50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10b60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
10b70 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
10b80 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
10b90 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
10ba0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10bb0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
10bc0 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
10bd0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10be0 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
10bf0 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
10c00 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
10c10 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10c20 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10c30 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
10c40 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10c50 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
10c60 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
10c70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
10c80 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10c90 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
10ca0 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
10cb0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
10cc0 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
10cd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
10ce0 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
10cf0 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
10d00 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
10d10 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
10d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
10d40 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
10d50 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
10d60 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
10d70 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
10d80 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
10d90 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
10da0 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
10db0 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
10dc0 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
10dd0 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
10de0 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
10df0 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
10e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10e10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
10e20 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
10e30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10e40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
10e50 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
10e60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10e70 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
10e80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
10e90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10ea0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
10eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ec0 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
10ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10ef0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
10f00 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
10f10 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
10f20 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
10f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
10f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10f50 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f70 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
10f80 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
10f90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
10fa0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
10fb0 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
10fc0 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
10fd0 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
10fe0 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
10ff0 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
11000 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
11010 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
11020 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
11030 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
11040 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
11050 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
11060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11070 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
11080 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
11090 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
110a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
110b0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
110c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
110d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
110e0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
110f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
11100 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
11110 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
11120 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
11130 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
11140 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
11150 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
11160 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
11170 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
11180 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
11190 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
111a0 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
111b0 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
111c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
111d0 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
111e0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
111f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
11200 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
11210 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
11220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
11230 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
11240 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
11250 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
11260 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
11270 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
11280 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
11290 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
112a0 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
112b0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
112c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
112d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
112e0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
112f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
11300 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
11310 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
11320 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
11330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11340 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
11350 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
11360 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
11370 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
11380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11390 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
113a0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
113b0 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
113c0 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
113d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
113e0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
113f0 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
11400 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
11410 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
11420 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11430 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
11440 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
11450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
11460 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
11470 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
11480 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
11490 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
114a0 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
114b0 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
114c0 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
114d0 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
114e0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
114f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
11500 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
11510 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11520 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
11530 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
11540 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
11550 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
11560 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
11570 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
11580 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
11590 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
115a0 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
115b0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
115c0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
115d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
115e0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
115f0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
11600 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
11610 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
11620 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
11630 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
11640 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
11650 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
11660 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
11670 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11680 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
11690 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
116a0 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
116b0 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
116c0 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
116d0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
116e0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
116f0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
11700 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
11710 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
11720 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
11730 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
11740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11750 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
11760 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
11770 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
11780 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
11790 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
117a0 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
117b0 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
117c0 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
117d0 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
117e0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
117f0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
11800 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
11810 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
11820 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
11830 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
11840 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
11850 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
11860 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
11870 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
11880 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
11890 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
118a0 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
118b0 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
118c0 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
118d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
118e0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
118f0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
11900 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11910 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
11920 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
11930 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
11940 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
11950 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11960 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
11970 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
11980 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
11990 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
119a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
119b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
119c0 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
119d0 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
119e0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
119f0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
11a00 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
11a10 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
11a20 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
11a30 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
11a40 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
11a50 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
11a60 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
11a70 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
11a80 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
11a90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
11aa0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
11ab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11ac0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11ad0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
11ae0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
11af0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
11b00 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
11b10 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11b20 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
11b30 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
11b40 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
11b50 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
11b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11b70 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11b80 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11b90 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11ba0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
11bb0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
11bc0 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
11bd0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
11be0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
11bf0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
11c00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
11c10 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
11c20 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
11c30 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
11c40 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
11c50 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11c60 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
11c70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11c80 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
11c90 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
11ca0 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
11cb0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
11cc0 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
11cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11ce0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
11cf0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
11d00 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
11d10 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
11d20 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
11d30 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
11d40 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
11d50 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
11d60 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
11d70 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
11d80 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
11d90 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
11da0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
11db0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
11dc0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
11dd0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
11de0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
11df0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
11e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11e10 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
11e20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11e40 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
11e50 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
11e60 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
11e70 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11e80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11e90 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
11ea0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
11eb0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
11ec0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
11ed0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
11ee0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11ef0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
11f00 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
11f10 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
11f20 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
11f30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11f40 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
11f50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11f60 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
11f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11f80 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
11f90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11fa0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
11fb0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
11fc0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
11fd0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
11fe0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
11ff0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
12000 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
12010 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
12020 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
12030 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
12040 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
12050 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
12060 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
12070 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
12080 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
12090 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
120a0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
120b0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
120c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
120d0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
120e0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
120f0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
12100 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
12110 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
12120 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
12130 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
12140 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
12150 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
12160 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
12170 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
12180 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
12190 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
121a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
121b0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
121c0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
121d0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
121e0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
121f0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
12200 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
12210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12220 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
12230 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
12240 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
12250 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12260 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
12270 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
12280 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
12290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
122a0 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
122b0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
122c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
122d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
122e0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
122f0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
12300 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
12310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12320 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
12330 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
12340 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
12350 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
12360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12370 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
12380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12390 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
123a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
123b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
123c0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
123d0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
123e0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
123f0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
12400 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
12410 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
12420 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
12430 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
12440 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
12450 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
12460 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
12470 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
12480 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
12490 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
124a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
124b0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
124c0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
124d0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
124e0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
124f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12500 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
12510 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12520 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
12530 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
12540 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12550 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
12560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
12580 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
12590 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
125a0 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
125b0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
125c0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
125d0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
125e0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
125f0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
12600 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
12610 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
12620 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
12630 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
12640 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
12650 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
12660 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
12670 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
12680 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
12690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
126a0 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
126b0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
126c0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
126d0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
126e0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
126f0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
12700 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12710 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
12720 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
12730 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
12740 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
12750 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12760 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
12770 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
12780 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
12790 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
127a0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
127b0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
127c0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
127d0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
127e0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
127f0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
12800 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12810 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
12820 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
12830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12840 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
12850 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12860 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
12870 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
12880 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
12890 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
128a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
128b0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
128c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
128d0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
128e0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
128f0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
12900 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
12910 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
12920 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
12930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12940 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
12950 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
12960 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
12970 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12980 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
12990 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
129a0 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
129b0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
129c0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
129d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
129e0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
129f0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
12a00 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
12a10 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
12a20 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
12a30 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
12a40 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
12a50 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
12a60 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
12a70 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
12a80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
12a90 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
12aa0 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
12ab0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
12ac0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
12ad0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
12ae0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
12af0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
12b00 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
12b10 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
12b20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
12b30 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
12b40 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
12b50 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
12b60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
12b70 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
12b80 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
12b90 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
12ba0 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
12bb0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
12bc0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
12bd0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
12be0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
12bf0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
12c00 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
12c10 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
12c20 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
12c30 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
12c40 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
12c50 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
12c60 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
12c70 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
12c80 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
12c90 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
12ca0 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
12cb0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
12cc0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
12cd0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
12ce0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
12cf0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
12d00 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
12d10 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
12d20 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
12d30 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
12d40 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
12d50 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
12d60 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
12d70 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
12d80 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
12d90 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
12da0 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
12db0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
12dc0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
12dd0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
12de0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
12df0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
12e00 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
12e10 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
12e20 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
12e30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
12e40 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
12e50 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
12e60 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
12e70 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
12e80 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
12e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12ea0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
12eb0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
12ec0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
12ed0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
12ee0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12ef0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
12f00 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
12f10 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
12f20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
12f30 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
12f40 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
12f50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
12f60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
12f70 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
12f80 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
12f90 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
12fa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12fb0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
12fc0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
12fd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
12fe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
12ff0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
13000 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
13010 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
13020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
13030 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13040 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
13050 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13060 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
13070 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
13080 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
13090 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
130a0 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
130b0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
130c0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
130d0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
130e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
130f0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
13100 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
13110 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
13120 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
13130 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
13140 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
13150 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
13160 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
13170 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
13180 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
13190 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
131a0 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
131b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
131c0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
131d0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
131e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
131f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
13200 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
13210 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
13220 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
13230 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
13240 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
13250 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
13260 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
13270 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
13280 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
13290 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
132a0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
132b0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
132c0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
132d0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
132e0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
132f0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
13300 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
13310 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
13320 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
13330 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
13340 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
13350 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
13360 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
13370 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
13380 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
13390 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
133a0 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
133b0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
133c0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
133d0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
133e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
133f0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
13400 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
13410 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
13420 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
13430 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
13440 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13450 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
13460 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
13470 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
13480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
13490 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
134a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
134b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
134c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
134d0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
134e0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
134f0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
13500 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
13510 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
13520 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
13530 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
13540 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
13550 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
13560 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
13570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
13590 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
135a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
135b0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
135c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
135d0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
135e0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
135f0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
13600 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
13610 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
13620 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
13630 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
13640 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
13650 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
13660 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
13670 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
13680 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
13690 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
136a0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
136b0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
136c0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
136d0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
136e0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
136f0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
13700 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
13710 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
13720 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
13730 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
13740 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
13750 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
13760 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
13770 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
13780 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
13790 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
137a0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
137b0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
137c0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
137d0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
137e0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
137f0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
13800 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
13810 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
13820 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
13830 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
13840 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13850 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
13860 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
13870 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
13880 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
13890 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
138a0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
138b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
138c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
138d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
138e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
138f0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
13900 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13910 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13930 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13940 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
13950 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
13960 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
13970 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
13980 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
13990 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
139a0 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
139b0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
139c0 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
139d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
139e0 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
139f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
13a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13a10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
13a20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
13a30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13a40 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
13a50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
13a60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
13a70 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
13a80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13a90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13aa0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
13ab0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
13ac0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
13ad0 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
13ae0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
13af0 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
13b00 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
13b10 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
13b20 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
13b30 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
13b40 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
13b50 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
13b60 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
13b70 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
13b80 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
13b90 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
13ba0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
13bb0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
13bc0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
13bd0 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
13be0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
13bf0 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
13c00 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
13c10 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
13c20 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
13c30 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
13c40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
13c50 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
13c60 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
13c70 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
13c80 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
13c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
13ca0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
13cb0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
13cc0 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
13cd0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13ce0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
13cf0 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
13d00 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
13d10 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
13d20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
13d30 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
13d40 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
13d50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13d60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13d70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13d80 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13d90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13da0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
13db0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
13dc0 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
13dd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13de0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13df0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13e00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
13e10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
13e20 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
13e30 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
13e40 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
13e50 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
13e60 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
13e70 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
13e80 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
13e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13ea0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
13eb0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
13ec0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13ed0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
13ee0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13ef0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
13f00 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
13f10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13f20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
13f30 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
13f40 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
13f50 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
13f60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13f70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13f80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13f90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
13fa0 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
13fb0 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
13fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
13fd0 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
13fe0 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
13ff0 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
14000 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
14010 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
14020 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
14030 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
14040 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
14050 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
14060 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
14070 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
14080 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
14090 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
140a0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
140b0 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
140c0 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
140d0 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
140e0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
140f0 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
14100 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
14110 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
14120 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
14130 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
14140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
14150 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
14160 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
14170 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
14180 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
14190 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
141a0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
141b0 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
141c0 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
141d0 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
141e0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
141f0 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
14200 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
14210 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14220 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
14230 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
14240 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
14250 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
14260 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
14270 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
14280 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
14290 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
142a0 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
142b0 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
142c0 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
142d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
142e0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
142f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
14300 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
14310 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
14320 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14330 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
14340 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14350 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
14360 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
14370 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
14380 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14390 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
143a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
143b0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
143c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
143d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
143e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
143f0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
14400 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
14410 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
14420 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
14430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
14440 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
14450 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
14460 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
14470 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
14480 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
14490 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
144a0 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
144b0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
144c0 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
144d0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
144e0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
144f0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
14500 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
14510 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
14520 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
14530 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
14540 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
14550 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
14560 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
14570 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
14580 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
14590 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
145a0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
145b0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
145c0 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
145d0 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
145e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
145f0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
14600 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
14610 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14620 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
14640 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
14650 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
14660 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
14670 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
14680 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
14690 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
146a0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
146b0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
146c0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
146d0 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
146e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
146f0 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
14700 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
14710 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
14720 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
14730 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
14740 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
14750 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
14760 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
14770 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
14780 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
14790 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
147a0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
147b0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
147c0 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
147d0 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
147e0 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
147f0 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
14800 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
14810 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
14820 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
14830 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
14840 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14850 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
14860 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
14870 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
14880 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
14890 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
148a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
148b0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
148c0 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
148d0 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
148e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
148f0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
14900 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
14910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14920 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
14930 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
14940 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
14950 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
14960 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
14970 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f  f /* SQLITE_HAS_
14980 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f  CODEC || SQLITE_
14990 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64  DEBUG */..#if !d
149a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
149b0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
149c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
149d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
149e0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
149f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14a00 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
14a10 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
14a20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
14a30 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
14a40 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
14a50 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
14a60 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
14a70 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
14a80 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
14a90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14aa0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
14ab0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
14ac0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
14ad0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
14ae0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
14af0 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
14b00 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
14b10 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14b20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
14b30 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
14b40 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
14b50 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
14b60 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
14b70 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
14b80 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
14b90 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
14ba0 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
14bb0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
14bc0 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
14bd0 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
14be0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
14bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14c00 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
14c10 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
14c20 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
14c30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14c40 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
14c50 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
14c60 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
14c70 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
14c80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14c90 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
14ca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
14cb0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
14cc0 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
14cd0 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
14ce0 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
14cf0 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
14d00 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
14d10 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
14d20 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
14d30 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
14d40 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
14d50 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
14d60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
14d70 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
14d80 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
14d90 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
14da0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
14db0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
14dc0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
14dd0 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
14de0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
14df0 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
14e00 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
14e10 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
14e20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14e30 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14e40 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
14e50 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
14e60 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
14e70 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
14e80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
14e90 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
14ea0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
14eb0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
14ec0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
14ed0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14ee0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
14ef0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
14f00 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
14f10 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
14f20 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
14f30 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
14f40 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
14f50 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
14f60 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
14f70 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
14f80 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
14f90 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
14fa0 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
14fb0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
14fc0 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
14fd0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
14fe0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14ff0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
15000 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15010 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
15020 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
15030 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
15040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15050 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
15060 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
15070 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
15080 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15090 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
150a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
150b0 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
150c0 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
150d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
150e0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
150f0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
15100 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
15110 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
15120 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
15130 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
15140 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
15150 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
15160 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
15170 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
15180 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
15190 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
151a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
151b0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
151c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
151d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
151e0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
151f0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
15200 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
15210 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
15220 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
15230 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
15240 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
15250 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
15260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
15270 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
15280 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
15290 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
152a0 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
152b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
152c0 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
152d0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
152e0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
152f0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
15300 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
15310 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
15320 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
15330 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
15340 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
15350 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15360 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15370 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
15380 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
15390 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
153a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
153b0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
153c0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
153d0 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
153e0 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
153f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15400 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
15410 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
15420 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
15430 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
15440 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
15450 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
15460 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
15470 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
15480 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
15490 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
154a0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
154b0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
154c0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
154d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
154e0 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
154f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
15500 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
15510 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
15520 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
15530 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
15540 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
15550 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
15560 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
15570 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
15580 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15590 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
155a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
155b0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
155c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
155d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
155e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
155f0 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
15600 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15610 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
15620 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
15630 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
15640 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15650 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15660 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15670 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
15680 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
15690 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
156a0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
156b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
156c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
156d0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
156e0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
156f0 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
15700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15710 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
15720 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
15730 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
15740 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
15750 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
15760 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
15770 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
15780 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
15790 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
157a0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
157b0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
157c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
157d0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
157e0 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
157f0 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
15800 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
15810 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
15820 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
15830 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
15840 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
15850 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
15860 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
15870 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
15880 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
15890 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
158a0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
158b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
158c0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
158d0 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
158e0 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
158f0 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
15900 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
15910 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
15920 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
15930 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
15940 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
15950 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
15960 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
15970 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
15980 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
15990 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
159a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
159b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
159c0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
159d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
159e0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
159f0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
15a00 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15a10 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
15a20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
15a30 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
15a40 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
15a50 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
15a60 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
15a70 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
15a80 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15a90 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
15aa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15ab0 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
15ac0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15ad0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15ae0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
15af0 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
15b00 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
15b10 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
15b20 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
15b30 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
15b40 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
15b50 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
15b60 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
15b70 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
15b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
15b90 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
15ba0 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
15bb0 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
15bc0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
15bd0 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
15be0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
15bf0 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
15c00 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
15c10 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
15c20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
15c30 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
15c40 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
15c50 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
15c60 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
15c70 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
15c80 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
15c90 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
15ca0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15cb0 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
15cc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15cd0 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
15ce0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
15cf0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
15d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15d10 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
15d20 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
15d30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15d40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15d50 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
15d60 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
15d70 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d  else if( isOpen=
15d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15d90 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
15da0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
15db0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15dc0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
15dd0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
15de0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
15df0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
15e00 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54   R-15465-20813 T
15e10 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d  he maximum and m
15e20 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  inimum embedded 
15e30 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66  payload.    ** f
15e40 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  ractions and the
15e50 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72   leaf payload fr
15e60 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75  action values mu
15e70 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e  st be 64, 32, an
15e80 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  d 32..    **.   
15e90 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
15ea0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
15eb0 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
15ec0 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
15ed0 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
15ee0 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
15ef0 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
15f00 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
15f10 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
15f20 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
15f30 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
15f40 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15f50 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15f60 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
15f70 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
15f80 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
15f90 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
15fa0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
15fb0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
15fc0 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
15fd0 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
15fe0 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
15ff0 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
16000 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
16010 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16020 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a  . */.    pageSiz
16030 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
16040 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
16050 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  <16);.    /* EVI
16060 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30  DENCE-OF: R-2500
16070 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65  8-21688 The size
16080 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20   of a page is a 
16090 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20  power of two.   
160a0 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20   ** between 512 
160b0 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73  and 65536 inclus
160c0 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ive. */.    if( 
160d0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
160e0 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
160f0 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
16100 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
16110 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
16120 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
16130 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
16140 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
16150 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
16160 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
16170 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  0 );.    /* EVID
16180 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30  ENCE-OF: R-59310
16190 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65  -51205 The "rese
161a0 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65  rved space" size
161b0 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20   in the 1-byte. 
161c0 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74     ** integer at
161d0 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68   offset 20 is th
161e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
161f0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
16200 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20  e end of.    ** 
16210 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73  each page to res
16220 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69  erve for extensi
16230 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ons. .    **.   
16240 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
16250 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
16260 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
16270 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
16280 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
16290 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
162a0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
162b0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
162c0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
162d0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
162e0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
162f0 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c  er. */.    usabl
16300 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
16310 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
16320 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
16330 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
16340 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
16350 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
16360 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
16370 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
16380 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
16390 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
163a0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
163b0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
163c0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
163d0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
163e0 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
163f0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
16400 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
16410 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
16420 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
16430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16440 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
16450 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
16460 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
16470 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
16480 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
16490 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
164a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
164b0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
164c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
164d0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
164e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
164f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
16500 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16510 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
16520 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
16530 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16540 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
16550 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
16580 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
16590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
165a0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
165b0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
165c0 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
165d0 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
165e0 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
165f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
16600 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
16610 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
16620 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
16630 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
16640 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34  F: R-28312-64704
16650 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73   However, the us
16660 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  able size is not
16670 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20   allowed to.    
16680 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ** be less than 
16690 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  480. In other wo
166a0 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65  rds, if the page
166b0 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68   size is 512, th
166c0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
166d0 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a  served space siz
166e0 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20  e cannot exceed 
166f0 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75  32. */.    if( u
16700 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
16710 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16720 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
16730 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
16740 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
16750 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  e;.    pBt->usab
16760 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
16770 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ize;.#ifndef SQL
16780 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16790 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  UUM.    pBt->aut
167a0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
167b0 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
167c0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
167d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
167e0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
167f0 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  e1[36 + 7*4])?1:
16800 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  0);.#endif.  }..
16810 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73    /* maxLocal is
16820 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
16830 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74  unt of payload t
16840 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
16850 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e  for.  ** a cell.
16860 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69    Make sure it i
16870 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73  s small enough s
16880 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20  o that at least 
16890 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63  minFanout.  ** c
168a0 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69  ells can will fi
168b0 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20  t on one page.  
168c0 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62  We assume a 10-b
168d0 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  yte page header.
168e0 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68  .  ** Besides th
168f0 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63  e payload, the c
16900 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a  ell must store:.
16910 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20    **     2-byte 
16920 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
16930 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  ell.  **     4-b
16940 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
16950 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74  r.  **     9-byt
16960 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a  e nKey value.  *
16970 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61  *     4-byte nDa
16980 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ta value.  **   
16990 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f    4-byte overflo
169a0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20  w page pointer. 
169b0 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f   ** So a cell co
169c0 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79  nsists of a 2-by
169d0 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65  te pointer, a he
169e0 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
169f0 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
16a00 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
16a10 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
16a20 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
16a30 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
16a40 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
16a50 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
16a60 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
16a70 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
16a80 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
16a90 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
16aa0 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  minLocal = (u16)
16ab0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
16ac0 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
16ad0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  3);.  pBt->maxLe
16ae0 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  af = (u16)(pBt->
16af0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29  usableSize - 35)
16b00 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
16b10 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
16b20 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
16b30 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66  /255 - 23);.  if
16b40 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e  ( pBt->maxLocal>
16b50 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  127 ){.    pBt->
16b60 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
16b70 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = 127;.  }else{.
16b80 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
16b90 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70  ePayload = (u8)p
16ba0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
16bb0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
16bc0 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
16bd0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
16be0 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
16bf0 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
16c00 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
16c10 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
16c20 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
16c30 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
16c40 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16c50 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
16c60 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
16c70 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
16c80 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
16c90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16ca0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
16cb0 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72  pBt. This is for
16cc0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
16cd0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
16ce0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
16cf0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
16d00 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
16d10 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ned..**.** Only 
16d20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
16d30 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f  e counted if wrO
16d40 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66  nly is true.  If
16d50 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61   wrOnly is.** fa
16d60 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72  lse then all cur
16d70 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
16d80 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
16d90 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
16da0 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73   routine, a curs
16db0 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
16dc0 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
16dd0 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f  ble of reading o
16de0 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  r writing to the
16df0 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73   database.  Curs
16e00 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65  ors that.** have
16e10 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e   been tripped in
16e20 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41  to the CURSOR_FA
16e30 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f  ULT state are no
16e40 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74  t counted..*/.st
16e50 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61  atic int countVa
16e60 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61  lidCursors(BtSha
16e70 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72  red *pBt, int wr
16e80 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
16e90 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
16ea0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
16eb0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
16ec0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
16ed0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
16ee0 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70  (wrOnly==0 || (p
16ef0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
16f00 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21  BTCF_WriteFlag)!
16f10 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72  =0).     && pCur
16f20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
16f30 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
16f40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
16f50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
16f60 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
16f70 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
16f80 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
16f90 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
16fa0 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
16fb0 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
16fc0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
16fd0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
16fe0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
16ff0 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
17000 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
17010 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
17020 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
17030 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
17040 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
17050 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
17060 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
17070 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
17080 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17090 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
170a0 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
170b0 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
170c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
170d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
170e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
170f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17100 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
17110 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
17120 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17130 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
17140 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
17150 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
17160 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
17170 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
17180 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
17190 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
171a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
171b0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
171c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
171d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
171e0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
171f0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
17200 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
17210 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
17220 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
17230 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
17240 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
17250 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
17260 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
17270 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
17280 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
17290 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
172a0 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
172b0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
172c0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
172d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
172e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
172f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17300 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
17310 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
17320 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17330 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17340 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
17350 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
17360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17370 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
17380 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
17390 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
173a0 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
173b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
173c0 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
173d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
173e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
173f0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
17400 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
17410 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
17420 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
17430 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
17440 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
17450 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
17460 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
17470 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
17480 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
17490 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
174a0 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
174b0 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
174c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
174d0 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
174e0 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
174f0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
17500 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
17510 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
17520 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
17530 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17540 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
17550 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
17560 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
17570 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
17580 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
17590 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
175a0 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
175b0 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
175c0 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
175d0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
175e0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
175f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17600 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17610 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
17620 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
17630 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
17640 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17650 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
17660 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
17670 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
17680 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
17690 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
176a0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
176b0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
176c0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
176d0 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
176e0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
176f0 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
17700 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17710 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
17720 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
17730 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
17740 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
17750 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
17760 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
17770 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
17780 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
17790 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
177a0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
177b0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
177c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
177d0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
177e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
177f0 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
17800 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
17810 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17820 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
17830 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
17840 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
17850 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
17860 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17880 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
17890 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
178a0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
178b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
178c0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
178d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
178e0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
178f0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
17900 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
17910 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
17920 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
17930 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
17940 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
17950 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
17960 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
17970 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
17980 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
17990 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
179a0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
179b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
179c0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
179d0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
179e0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
179f0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
17a00 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
17a10 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
17a20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
17a30 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
17a40 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
17a50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
17a60 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
17a70 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
17a80 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
17a90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17aa0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
17ab0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
17ac0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
17ad0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
17ae0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
17af0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
17b00 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
17b10 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
17b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
17b30 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
17b40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
17b50 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
17b60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17b70 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
17b80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17b90 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
17ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
17bb0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
17bc0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
17bd0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
17be0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
17bf0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
17c00 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
17c10 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
17c20 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
17c30 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
17c40 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
17c50 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
17c60 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
17c70 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
17c80 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
17c90 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
17ca0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
17cb0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
17cc0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
17cd0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
17ce0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
17cf0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
17d00 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
17d10 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
17d20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
17d30 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
17d40 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
17d50 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
17d60 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
17d70 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
17d80 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
17d90 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
17da0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
17db0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
17dc0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
17dd0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
17de0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
17df0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
17e00 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
17e10 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
17e20 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
17e30 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
17e40 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
17e50 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
17e60 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
17e70 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
17e80 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
17e90 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
17ea0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
17eb0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
17ec0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
17ed0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
17ee0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
17ef0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
17f00 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
17f10 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17f20 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
17f30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
17f40 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
17f50 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
17f60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
17f70 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
17f80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17fa0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
17fb0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
17fc0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
17fd0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
17fe0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17ff0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
18000 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
18010 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
18020 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
18030 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
18040 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
18050 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
18060 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
18070 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
18080 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
18090 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
180a0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
180b0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
180c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
180d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
180e0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
180f0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
18100 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
18110 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
18120 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
18130 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
18140 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
18150 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
18160 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18170 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
18180 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
18190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
181a0 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
181b0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
181c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
181d0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
181e0 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
181f0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
18200 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
18210 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
18220 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
18230 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
18240 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
18250 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
18260 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
18270 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
18280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
18290 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
182a0 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
182b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
182c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
182d0 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
182e0 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
182f0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
18300 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
18310 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
18320 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
18330 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
18340 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
18350 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
18360 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
18370 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
18380 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
18390 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
183a0 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
183b0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
183c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
183d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
183e0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
183f0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
18400 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
18410 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
18420 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
18430 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
18440 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
18450 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
18460 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
18470 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
18480 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
18490 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
184a0 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
184b0 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
184c0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
184d0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
184e0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
184f0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
18500 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18510 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
18520 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
18530 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
18540 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
18550 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
18560 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
18570 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
18580 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
18590 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
185a0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
185b0 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
185c0 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
185d0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
185e0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
185f0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
18600 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
18610 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
18620 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
18630 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
18640 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
18650 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
18660 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
18670 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
18680 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
18690 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
186a0 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
186b0 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
186c0 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
186d0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
186e0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
186f0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
18700 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
18710 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
18720 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
18730 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
18740 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
18750 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
18760 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
18770 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
18780 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
18790 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
187a0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
187b0 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
187c0 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
187d0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
187e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
187f0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
18800 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
18810 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
18820 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
18830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
18840 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
18850 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
18860 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
18870 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
18880 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
18890 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
188a0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
188b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
188c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
188d0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
188e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
188f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
18900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
18920 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
18930 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
18940 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
18950 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
18960 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18970 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
18980 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
18990 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
189a0 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
189b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
189c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
189d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
189e0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
189f0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
18a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18a10 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
18a20 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
18a30 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
18a40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
18a50 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
18a60 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
18a70 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
18a80 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
18a90 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
18aa0 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
18ab0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
18ac0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
18ad0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
18ae0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
18af0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
18b00 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
18b10 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
18b20 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
18b30 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
18b40 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
18b50 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18b60 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
18b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18b80 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
18b90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
18ba0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
18bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18bc0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
18bd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
18be0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
18bf0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
18c00 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
18c10 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
18c20 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
18c30 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
18c40 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
18c50 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
18c60 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
18c70 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
18c80 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
18c90 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
18ca0 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
18cb0 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
18cc0 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
18cd0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
18ce0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
18cf0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
18d00 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
18d10 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
18d20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
18d30 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
18d40 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
18d50 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
18d60 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
18d70 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
18d80 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
18d90 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
18da0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
18db0 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
18dc0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
18dd0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
18de0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
18df0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
18e00 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
18e10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18e20 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
18e30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18e50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
18e60 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
18e70 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
18e80 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
18e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18ea0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
18eb0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
18ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
18ed0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
18ee0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
18ef0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
18f00 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
18f10 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
18f20 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
18f30 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
18f40 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
18f50 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
18f60 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
18f70 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
18f80 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
18f90 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
18fa0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
18fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18fc0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
18fd0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
18fe0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
18ff0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
19000 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
19010 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19020 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19030 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
19040 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19050 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
19060 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
19070 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
19080 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
19090 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
190a0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
190b0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
190c0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
190d0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
190e0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
190f0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
19100 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
19110 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
19120 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
19130 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
19140 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
19170 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
19180 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
191b0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
191c0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
191d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
191f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19200 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19210 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
19220 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
19230 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
19240 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
19250 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
19260 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19270 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
19280 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19290 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
192a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
192b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
192c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
192d0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
192e0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
192f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
19300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
19310 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
19320 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
19330 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
19340 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
19350 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
19360 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
19370 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
19380 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
19390 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
193a0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
193b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
193c0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
193d0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
193e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
193f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
19400 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
19410 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
19420 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
19430 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
19440 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
19450 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
19460 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
19470 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
19480 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
19490 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
194a0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
194b0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
194c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
194d0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
194e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
194f0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
19500 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
19510 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
19520 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
19530 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
19540 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
19550 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
19560 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
19570 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
19580 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
19590 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
195a0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
195b0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
195c0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
195f0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
19600 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
19610 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
19620 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
19630 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
19640 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19650 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
19660 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
19670 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
19680 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
19690 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
196a0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
196b0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
196c0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
196d0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
196e0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
196f0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
19700 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
19710 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
19720 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
19730 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
19740 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
19750 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
19760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19770 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
19780 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
19790 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
197a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
197b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
197c0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
197d0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
197e0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
197f0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
19800 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
19810 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
19820 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
19830 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
19840 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
19850 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
19860 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19870 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
19880 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
19890 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
198a0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
198b0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
198c0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
198d0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
198e0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
198f0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
19900 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
19910 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
19920 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
19930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
19940 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
19950 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
19960 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19970 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
19980 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
19990 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
199a0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
199b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
199c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
199d0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
199e0 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
199f0 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
19a00 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
19a10 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
19a20 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
19a30 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
19a40 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
19a50 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
19a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
19a70 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
19a80 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
19a90 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
19aa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
19ab0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19ac0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
19ad0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
19ae0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
19af0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
19b00 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
19b10 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
19b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
19b30 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
19b40 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
19b50 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
19b60 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
19b70 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
19b80 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
19b90 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
19ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
19bb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19bc0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
19bd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19be0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
19bf0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
19c00 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
19c10 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
19c20 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
19c30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
19c40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
19c50 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
19c60 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
19c70 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
19c80 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
19c90 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
19ca0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
19cb0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
19cc0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
19cd0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
19ce0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
19cf0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
19d00 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
19d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
19d20 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
19d30 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
19d40 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
19d50 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
19d60 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
19d70 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
19d80 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
19d90 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
19da0 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
19db0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
19dc0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
19dd0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
19de0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
19df0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
19e00 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
19e10 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
19e20 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
19e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
19e40 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
19e50 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
19e60 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
19e70 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
19e80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
19e90 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
19ea0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
19eb0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
19ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19ed0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
19ee0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
19ef0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
19f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
19f10 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
19f20 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
19f30 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
19f40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
19f50 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
19f60 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
19f70 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
19f80 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
19f90 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
19fa0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
19fb0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
19fc0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
19fd0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
19fe0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
19ff0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1a000 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1a010 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1a020 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1a030 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1a040 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1a050 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a060 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a070 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1a080 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1a090 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
1a0a0 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1a0b0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1a0c0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1a0d0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1a0e0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1a0f0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1a100 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1a110 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1a120 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1a130 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1a140 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1a150 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1a160 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a170 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1a180 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1a190 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1a1a0 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1a1b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a1c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a1d0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1a1e0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1a1f0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1a200 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1a210 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1a220 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1a230 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1a240 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1a250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1a260 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1a270 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1a280 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1a290 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1a2a0 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1a2b0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1a2c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1a2d0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1a2e0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1a2f0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1a300 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1a310 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1a320 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1a330 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1a340 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1a350 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1a360 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1a370 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1a380 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1a390 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1a3a0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1a3b0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1a3c0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1a3d0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1a3e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a3f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a410 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1a420 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1a430 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1a440 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1a450 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1a460 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1a470 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1a480 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1a490 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1a4a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a4b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a4c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a4e0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1a4f0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1a500 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1a510 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1a520 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1a530 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1a540 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1a550 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1a560 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1a570 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1a580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a590 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1a5a0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1a5b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1a5c0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1a5d0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1a5e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a5f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a600 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1a610 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1a620 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1a630 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1a640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a650 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1a660 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1a670 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a680 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1a690 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1a6a0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1a6b0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1a6c0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1a6d0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1a6e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a6f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a700 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1a710 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1a720 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1a730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a740 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1a750 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1a760 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1a770 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1a780 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1a790 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1a7a0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1a7b0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1a7c0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1a7d0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1a7e0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1a7f0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1a800 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1a810 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1a820 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1a830 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1a840 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1a850 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1a860 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1a870 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1a880 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1a890 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1a8a0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1a8b0 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1a8c0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1a8d0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1a8e0 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1a8f0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1a900 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1a910 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1a920 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1a930 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1a940 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1a950 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1a960 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1a970 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1a980 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1a990 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1a9a0 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1a9b0 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1a9c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1a9d0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1a9e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1a9f0 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1aa00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1aa10 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1aa20 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1aa30 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1aa40 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1aa50 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1aa60 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1aa70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1aa80 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1aa90 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1aaa0 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1aab0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1aac0 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1aad0 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1aae0 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1aaf0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1ab00 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1ab10 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1ab20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1ab30 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1ab40 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1ab50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1ab60 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ab70 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1ab80 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1ab90 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1aba0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1abb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1abc0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1abd0 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1abe0 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1abf0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1ac00 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1ac10 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1ac20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1ac30 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1ac40 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1ac50 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1ac60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1ac70 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ac80 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1ac90 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1aca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1acb0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1acc0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1acd0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1ace0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1acf0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ad00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ad10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ad20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1ad30 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1ad40 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1ad50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ad60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1ad70 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1ad80 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1ad90 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1ada0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1adb0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1adc0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1add0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1ade0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1adf0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1ae00 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1ae10 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1ae20 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1ae30 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1ae40 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1ae50 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1ae60 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1ae70 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1ae80 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1ae90 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1aea0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1aeb0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1aec0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1aed0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1aee0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1aef0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1af00 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1af10 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1af20 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1af30 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1af40 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1af50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1af60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1af70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1af80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1af90 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1afa0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1afb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1afc0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1afd0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1afe0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1aff0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1b000 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1b010 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1b020 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1b030 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1b040 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1b050 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1b060 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1b070 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1b080 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1b090 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1b0a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b0b0 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1b0c0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1b0d0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1b0e0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1b0f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1b100 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1b110 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b130 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b140 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1b150 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1b160 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1b170 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1b180 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1b190 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1b1a0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1b1b0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1b1c0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1b1d0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1b1e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1b1f0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1b200 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1b210 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1b220 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1b230 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1b240 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1b250 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1b260 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1b270 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1b280 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1b290 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b2a0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1b2b0 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1b2c0 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1b2d0 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1b2e0 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1b2f0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1b300 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1b310 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1b320 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1b330 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1b340 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1b350 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1b360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b380 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1b390 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1b3a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1b3c0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1b3d0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1b3e0 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1b3f0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1b400 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1b410 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1b420 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1b430 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1b440 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1b450 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1b460 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1b470 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b480 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1b490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b4a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1b4b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b4c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b4d0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1b4e0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1b4f0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1b500 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1b510 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1b520 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1b530 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1b540 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1b550 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1b560 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1b570 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1b580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b590 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1b5a0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1b5b0 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1b5c0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1b5d0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1b5e0 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1b5f0 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1b600 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1b610 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1b620 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1b630 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1b640 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1b650 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1b660 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1b670 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1b680 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1b690 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1b6a0 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1b6b0 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b6e0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1b6f0 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1b700 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1b730 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1b740 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1b750 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1b760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b770 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1b780 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1b790 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1b7a0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1b7b0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1b7c0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1b7d0 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1b7e0 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1b7f0 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1b800 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1b810 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1b820 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1b830 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1b840 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1b850 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1b860 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1b870 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1b880 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1b890 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1b8a0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1b8b0 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1b8c0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1b8d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1b8e0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1b8f0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1b900 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1b910 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1b920 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1b930 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1b940 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1b950 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1b960 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1b970 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1b980 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1b990 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1b9a0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1b9b0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1b9c0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1b9d0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1b9e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1b9f0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1ba00 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1ba10 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1ba20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1ba30 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1ba40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1ba50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ba60 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1ba70 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1ba80 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1ba90 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1baa0 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1bab0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1bac0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1bad0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1bae0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1baf0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1bb00 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1bb10 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1bb20 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1bb30 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1bb40 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1bb50 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1bb60 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1bb70 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1bb80 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1bb90 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1bba0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bbb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bbc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1bbd0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1bbe0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1bbf0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1bc00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bc10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1bc20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1bc30 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1bc40 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1bc50 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1bc60 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1bc70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1bc80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bc90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1bca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1bcb0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1bcc0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1bcd0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1bce0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1bcf0 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1bd00 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1bd10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1bd20 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1bd30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1bd40 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1bd50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bd60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1bd70 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1bd80 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1bd90 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1bda0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1bdb0 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1bdc0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1bdd0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1bde0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1bdf0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1be00 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1be10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1be20 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1be30 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1be40 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1be50 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1be60 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1be70 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1be80 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1be90 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1bea0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1beb0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1bec0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1bed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
1bee0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
1bef0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1bf00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bf10 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1bf20 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1bf30 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
1bf40 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
1bf50 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1bf60 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
1bf70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1bf80 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1bf90 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
1bfa0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1bfb0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
1bfc0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
1bfd0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
1bfe0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
1bff0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
1c000 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c010 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1c020 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
1c030 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
1c040 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
1c050 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c060 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1c070 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
1c080 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
1c090 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
1c0a0 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
1c0b0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
1c0c0 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1c0d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1c0e0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
1c0f0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
1c100 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1c110 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
1c120 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1c130 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
1c140 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1c150 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1c160 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
1c170 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
1c180 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
1c190 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
1c1a0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
1c1b0 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
1c1c0 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
1c1d0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
1c1e0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
1c1f0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
1c200 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
1c210 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
1c220 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1c240 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c250 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
1c260 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1c270 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1c280 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
1c290 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1c2a0 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
1c2b0 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
1c2c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c2d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c2e0 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
1c2f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c300 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1c310 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
1c320 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
1c330 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
1c340 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c350 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1c360 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1c370 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1c380 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1c390 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1c3a0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1c3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1c3c0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1c3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c3e0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1c3f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1c400 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c410 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c420 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1c430 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1c440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1c450 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1c460 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1c470 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1c480 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1c490 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1c4a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1c4b0 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1c4c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1c4f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1c500 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1c510 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1c520 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1c530 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1c540 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1c550 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1c560 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1c570 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1c580 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1c590 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1c5a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c5b0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1c5c0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1c5d0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1c5e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1c5f0 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1c600 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1c610 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1c620 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1c630 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1c640 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1c650 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1c660 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1c670 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1c680 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1c690 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1c6a0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1c6b0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1c6c0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1c6d0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1c6e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1c6f0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1c700 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1c710 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1c720 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1c730 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1c740 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1c750 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1c760 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1c770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c780 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1c790 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1c7a0 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1c7b0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1c7c0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1c7d0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1c7e0 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1c7f0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1c800 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1c810 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1c820 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1c830 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1c840 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1c850 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1c860 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1c870 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1c880 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1c890 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1c8a0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1c8b0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1c8c0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1c8d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1c8e0 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1c8f0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1c900 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1c910 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1c920 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1c930 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c940 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1c950 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1c960 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1c970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1c980 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1c990 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1c9a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1c9b0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1c9c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1c9d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1c9e0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1c9f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1ca00 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1ca10 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1ca20 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1ca30 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1ca40 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1ca50 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1ca60 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1ca70 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1ca80 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1ca90 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1caa0 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1cab0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1cac0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1cad0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1cae0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1caf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1cb00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1cb10 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1cb20 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1cb30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1cb40 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1cb50 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1cb60 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1cb70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1cb80 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1cb90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1cba0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cbb0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1cbc0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1cbd0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1cbe0 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1cbf0 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1cc00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cc10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1cc20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1cc30 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1cc40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1cc50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1cc60 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1cc70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1cc80 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1cc90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1cca0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1ccb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1ccc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ccd0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1cce0 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1ccf0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1cd00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1cd10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cd20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1cd30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cd40 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1cd50 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1cd60 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1cd70 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1cd80 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1cd90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1cda0 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1cdb0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1cdc0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1cdd0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1cde0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1cdf0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1ce00 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1ce10 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1ce20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1ce30 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1ce40 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1ce50 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1ce60 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1ce70 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1ce80 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1ce90 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1cea0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1ceb0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1cec0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1ced0 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1cee0 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1cef0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1cf00 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1cf10 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1cf20 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
1cf30 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
1cf40 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1cf50 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
1cf60 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
1cf70 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1cf80 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
1cf90 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
1cfa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1cfb0 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1cfc0 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
1cfd0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1cfe0 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
1cff0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1d000 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
1d010 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
1d020 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d030 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
1d040 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
1d050 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1d060 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
1d070 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
1d080 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
1d090 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
1d0a0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
1d0b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1d0c0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
1d0d0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
1d0e0 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
1d0f0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1d100 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1d110 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
1d120 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
1d130 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1d140 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1d150 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
1d160 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1d170 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1d180 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1d190 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
1d1a0 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
1d1b0 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
1d1c0 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
1d1d0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
1d1e0 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
1d1f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
1d200 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
1d210 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
1d220 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1d230 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1d240 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1d250 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1d260 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1d270 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1d280 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1d290 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d2a0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1d2b0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1d2c0 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1d2d0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1d2e0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1d2f0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1d300 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1d310 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1d320 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1d330 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1d340 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1d350 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1d360 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1d370 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1d380 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1d390 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1d3a0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1d3b0 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1d3c0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1d3d0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1d3e0 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1d3f0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1d400 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1d410 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1d420 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1d430 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1d440 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1d450 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1d460 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1d470 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d480 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1d490 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1d4a0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1d4b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d4c0 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1d4d0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1d4e0 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1d4f0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1d500 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1d510 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1d520 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1d530 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1d540 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1d550 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1d560 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1d570 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d580 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1d590 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1d5a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1d5b0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1d5c0 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1d5d0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1d5e0 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1d5f0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1d600 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1d610 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1d620 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1d630 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1d640 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1d650 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1d660 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1d670 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1d680 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1d690 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1d6a0 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1d6b0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1d6c0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1d6d0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1d6e0 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1d6f0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1d700 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1d710 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1d720 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1d730 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1d740 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1d750 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1d760 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1d770 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1d780 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d790 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1d7a0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1d7b0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1d7c0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1d7d0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1d7e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1d7f0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1d800 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1d810 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1d820 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1d830 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1d840 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1d850 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1d860 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1d870 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1d880 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1d890 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1d8a0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1d8b0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1d8c0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d8d0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1d8e0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1d8f0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1d900 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1d910 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1d920 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1d930 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d940 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1d950 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1d960 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d970 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1d980 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1d990 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1d9a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1d9b0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1d9c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1d9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d9e0 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1d9f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1da00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1da10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1da30 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1da40 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1da50 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1da60 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1da70 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1da80 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1da90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1daa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dab0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1dac0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1dad0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1dae0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1daf0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1db00 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1db10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1db20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1db30 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1db40 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1db50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1db60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1db70 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1db80 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1db90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1dba0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1dbb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1dbc0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1dbd0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1dbe0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1dbf0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1dc00 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1dc10 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
1dc20 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
1dc30 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1dc40 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
1dc50 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
1dc60 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
1dc70 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
1dc80 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
1dc90 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
1dca0 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
1dcb0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1dcc0 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
1dcd0 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
1dce0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1dcf0 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
1dd00 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1dd10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1dd20 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1dd30 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
1dd40 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1dd50 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1dd60 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1dd70 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1dd80 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
1dd90 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
1dda0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
1ddb0 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
1ddc0 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
1ddd0 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
1dde0 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
1ddf0 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
1de00 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
1de10 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
1de20 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
1de30 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
1de40 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
1de50 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
1de60 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
1de70 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
1de80 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
1de90 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
1dea0 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
1deb0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
1dec0 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
1ded0 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
1dee0 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
1def0 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
1df00 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
1df10 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
1df20 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
1df30 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
1df40 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
1df50 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
1df60 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
1df70 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
1df80 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
1df90 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1dfa0 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
1dfb0 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
1dfc0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
1dfd0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1dfe0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
1dff0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
1e000 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
1e010 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
1e020 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e030 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
1e040 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
1e050 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1e060 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
1e070 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
1e080 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1e090 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
1e0a0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1e0b0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1e0c0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1e0d0 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
1e0e0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1e0f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1e100 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1e110 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
1e120 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
1e130 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
1e140 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
1e150 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
1e160 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1e170 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
1e180 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
1e190 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1e1a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1e1b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
1e1c0 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
1e1d0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
1e1e0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
1e1f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
1e200 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e210 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20  VALID ){.       
1e220 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
1e230 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
1e240 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e260 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
1e270 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1e280 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
1e290 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
1e2a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e2b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e2c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1e2d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e2e0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1e2f0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
1e300 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1e310 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
1e320 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1e330 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
1e340 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1e350 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1e360 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1e370 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
1e380 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
1e390 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
1e3a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1e3b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e3c0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1e3d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e3e0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
1e3f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1e400 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1e410 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
1e420 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
1e430 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
1e440 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
1e450 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
1e460 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1e470 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
1e480 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
1e490 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
1e4a0 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
1e4b0 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
1e4c0 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
1e4d0 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
1e4e0 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
1e4f0 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
1e500 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1e510 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1e520 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1e530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e540 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1e550 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1e560 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1e570 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1e580 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1e590 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1e5a0 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1e5b0 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
1e5c0 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
1e5d0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1e5e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1e5f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1e600 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
1e610 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
1e620 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
1e630 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
1e640 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
1e650 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
1e660 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1e670 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e680 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
1e690 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1e6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1e6b0 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
1e6c0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e6d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1e6e0 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
1e6f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1e700 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e710 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
1e720 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
1e730 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
1e740 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1e750 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
1e760 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
1e770 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1e780 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
1e790 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
1e7a0 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
1e7b0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1e7c0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
1e7d0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1e7e0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1e7f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1e800 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1e810 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1e820 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1e830 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1e840 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1e850 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1e860 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1e870 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1e880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e890 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1e8a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1e8b0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1e8c0 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1e8d0 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1e8e0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1e8f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1e900 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1e910 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1e920 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1e930 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1e940 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1e950 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e960 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
1e970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e980 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1e990 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1e9a0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1e9b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e9c0 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
1e9d0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1e9e0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
1e9f0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1ea00 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1ea10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
1ea20 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
1ea30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1ea40 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
1ea50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ea60 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
1ea70 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
1ea80 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
1ea90 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
1eaa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1eab0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1eac0 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
1ead0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
1eae0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1eaf0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1eb00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1eb10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1eb20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
1eb30 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
1eb40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1eb50 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1eb60 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1eb70 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1eb80 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1eb90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1eba0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1ebb0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1ebc0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1ebd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1ebe0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1ebf0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1ec00 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1ec10 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1ec20 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1ec30 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1ec40 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1ec50 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1ec60 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1ec70 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1ec80 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1ec90 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1eca0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1ecb0 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1ecc0 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1ecd0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1ece0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1ecf0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1ed00 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1ed10 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1ed20 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1ed30 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1ed40 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1ed50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1ed60 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1ed70 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1ed80 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1ed90 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1eda0 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1edb0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1edc0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1edd0 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1ede0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1edf0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1ee00 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1ee10 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1ee20 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1ee30 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1ee40 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1ee50 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1ee60 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1ee70 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1ee80 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1ee90 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1eea0 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1eeb0 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1eec0 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1eed0 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1eee0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1eef0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1ef00 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1ef10 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1ef20 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1ef30 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1ef40 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1ef50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1ef60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1ef70 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1ef80 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1ef90 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1efa0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
1efb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1efc0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
1efd0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1efe0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1eff0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1f000 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1f010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1f020 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1f030 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1f040 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1f050 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1f060 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f070 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1f080 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1f090 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1f0a0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1f0b0 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1f0c0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1f0d0 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1f0e0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1f0f0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1f100 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1f110 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1f120 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1f130 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f140 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1f150 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1f160 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1f170 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1f180 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1f190 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1f1a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f1b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f1c0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1f1d0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1f1e0 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1f1f0 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1f200 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1f210 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1f220 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1f230 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1f240 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1f250 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1f260 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1f270 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1f280 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1f290 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1f2a0 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1f2b0 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1f2c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1f2d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1f2e0 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1f2f0 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1f300 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1f310 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1f320 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1f330 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1f340 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1f350 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1f360 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1f370 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1f380 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1f390 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1f3a0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1f3b0 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1f3c0 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1f3d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1f3e0 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1f3f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1f400 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1f410 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1f420 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1f430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f440 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1f450 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1f460 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1f470 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f480 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1f490 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1f4a0 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1f4b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1f4c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1f4d0 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1f4e0 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1f4f0 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1f500 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1f510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1f520 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1f530 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1f540 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1f550 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1f560 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1f570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f580 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1f590 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
1f5a0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
1f5b0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
1f5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1f5d0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1f5e0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
1f5f0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1f600 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f610 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
1f620 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
1f630 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
1f640 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1f650 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
1f660 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
1f670 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
1f680 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
1f690 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1f6a0 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
1f6b0 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
1f6c0 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
1f6d0 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
1f6e0 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
1f6f0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
1f700 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
1f710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f720 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1f730 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1f740 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1f750 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1f760 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1f770 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1f780 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1f790 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1f7a0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1f7b0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1f7c0 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1f7d0 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1f7e0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f7f0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1f800 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1f810 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1f820 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1f830 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1f840 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1f850 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1f860 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1f870 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1f880 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1f890 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1f8a0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1f8b0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1f8c0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1f8d0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1f8e0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1f8f0 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1f900 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1f910 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1f920 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1f930 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1f940 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1f950 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1f960 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1f970 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1f980 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1f990 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1f9a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1f9b0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1f9c0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1f9d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1f9e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1f9f0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1fa00 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1fa10 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1fa20 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1fa30 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1fa40 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1fa50 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1fa60 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1fa70 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1fa80 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1fa90 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1faa0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1fab0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1fac0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1fad0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1fae0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1faf0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1fb00 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1fb10 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1fb20 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1fb30 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1fb40 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1fb50 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1fb60 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1fb70 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1fb80 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1fb90 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1fba0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1fbb0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1fbc0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1fbd0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1fbe0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1fbf0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1fc00 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1fc10 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1fc20 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1fc30 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1fc40 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1fc50 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1fc60 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
1fc70 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1fc80 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
1fc90 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1fca0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
1fcb0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1fcc0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1fcd0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1fd00 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1fd30 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1fd40 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1fd50 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd70 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1fd80 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1fd90 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1fda0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1fdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1fdc0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
1fdd0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
1fde0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1fdf0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1fe00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1fe10 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
1fe20 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
1fe30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1fe40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fe50 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
1fe60 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
1fe70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1fe80 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1fe90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1fea0 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1feb0 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
1fec0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1fed0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
1fee0 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
1fef0 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
1ff00 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
1ff10 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
1ff20 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
1ff30 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1ff40 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
1ff50 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
1ff60 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
1ff70 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
1ff80 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
1ff90 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
1ffa0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
1ffb0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
1ffc0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1ffd0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
1ffe0 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
1fff0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
20000 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
20010 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
20020 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
20030 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
20040 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
20050 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
20060 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
20070 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
20080 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
20090 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
200a0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
200b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
200c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
200d0 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
200e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
200f0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
20100 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62  rFlag && (pBt->b
20110 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
20120 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a  AD_ONLY)!=0) ){.
20130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20140 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
20150 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a    if( wrFlag ){.
20160 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
20170 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
20180 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
20190 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ce==0 ) return S
201a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
201b0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
201c0 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
201d0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
201e0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
201f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
20200 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
20210 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
20220 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
20230 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
20240 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
20250 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
20260 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
20270 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
20280 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
20290 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
202a0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
202b0 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
202c0 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
202d0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
202e0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
202f0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
20300 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73  >pBt = pBt;.  as
20310 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
20320 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f  || wrFlag==BTCF_
20330 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70  WriteFlag );.  p
20340 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
20350 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
20360 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
20370 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
20380 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
20390 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
203a0 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
203b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
203c0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
203d0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
203e0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
203f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
20400 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
20410 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
20450 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
20490 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
204a0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
204d0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
204e0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
204f0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
20500 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
20510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20520 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
20530 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
20540 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20570 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
20580 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
20590 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
205a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
205b0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
205c0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
205d0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
205e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
205f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
20610 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
20620 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
20630 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
20640 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
20650 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
20660 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
20670 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
20680 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
20690 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
206a0 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
206b0 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
206c0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
206d0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
206e0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
206f0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
20700 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
20710 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
20720 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
20730 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
20740 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
20750 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
20760 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
20770 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
20780 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
20790 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
207a0 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
207b0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
207c0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
207d0 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
207e0 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
207f0 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
20800 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
20810 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
20820 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
20830 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
20840 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
20850 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
20860 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
20870 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
20880 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
20890 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
208a0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
208b0 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
208c0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
208d0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
208e0 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
208f0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
20900 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
20910 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
20920 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
20930 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
20940 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20950 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
20960 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
20970 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
20980 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
20990 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
209a0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
209b0 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
209c0 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
209d0 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
209e0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
209f0 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
20a00 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
20a10 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20a20 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
20a30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
20a40 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
20a50 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
20a60 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
20a70 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
20a80 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
20a90 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
20aa0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
20ab0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
20ac0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
20ad0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
20ae0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
20af0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
20b00 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
20b10 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
20b20 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
20b30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20b40 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
20b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
20b60 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
20b70 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
20b80 65 33 44 62 46 72 65 65 28 70 42 74 72 65 65 2d  e3DbFree(pBtree-
20b90 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72  >db, pCur->aOver
20ba0 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
20bb0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
20bc0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
20bd0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
20be0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
20bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20c00 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
20c10 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
20c20 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
20c30 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
20c40 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
20c50 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
20c60 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
20c70 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
20c80 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
20c90 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
20ca0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
20cb0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
20cc0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
20cd0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
20ce0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
20cf0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
20d00 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
20d10 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
20d20 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
20d30 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
20d40 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
20d50 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
20d60 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
20d70 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
20d80 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
20d90 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
20da0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
20db0 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
20dc0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
20dd0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
20de0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
20df0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
20e00 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
20e10 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
20e20 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
20e30 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
20e40 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
20e50 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
20e60 61 67 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e  aggressive inlin
20e70 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
20e80 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
20e90 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
20ea0 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
20eb0 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
20ec0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
20ed0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
20ee0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
20ef0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
20f00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
20f10 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
20f20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
20f30 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
20f40 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
20f50 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
20f60 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
20f70 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
20f80 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
20f90 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
20fa0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
20fb0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
20fc0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
20fd0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
20fe0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
20ff0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
21000 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
21010 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
21020 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
21030 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
21040 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
21050 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
21060 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
21070 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
21080 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
21090 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
210a0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
210b0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
210c0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
210d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
210e0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
210f0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
21100 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
21110 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
21120 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
21130 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21140 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
21150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21160 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
21170 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
21180 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
21190 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
211a0 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
211b0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
211c0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
211d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
211e0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
211f0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
21200 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
21240 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
21250 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
21290 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
212a0 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
212e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
212f0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
21300 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
21310 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
21320 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20  );        \.    
21330 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
21340 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
21350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
21380 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
213d0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
213e0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
213f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21420 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
21430 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
21440 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
21450 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
21460 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
21470 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
21480 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
21490 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
214a0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
214b0 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
214c0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
214d0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
214e0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
214f0 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
21500 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
21510 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
21520 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
21530 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
21540 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
21550 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
21560 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
21570 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
21580 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
21590 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
215a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
215b0 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
215c0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
215d0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
215e0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
215f0 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
21600 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
21610 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
21620 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
21630 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
21640 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
21650 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
21660 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
21670 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
21680 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
21690 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
216a0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
216b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
216c0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
216d0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
216e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
216f0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
21700 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
21710 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
21720 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
21730 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
21740 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
21750 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
21760 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
21770 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
21780 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
21790 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
217a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
217b0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
217c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
217d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
217e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
217f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21800 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
21810 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
21820 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
21830 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72  fo.nKey;.  retur
21840 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21850 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
21860 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
21870 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
21880 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
21890 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
218a0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
218b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
218c0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
218d0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
218e0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
218f0 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
21900 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
21910 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
21920 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
21930 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
21940 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
21950 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
21960 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21970 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
21980 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
21990 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
219a0 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
219b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
219c0 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
219d0 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
219e0 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
219f0 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
21a00 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
21a10 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
21a20 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
21a30 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
21a40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21a50 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
21a60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
21a70 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
21a80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21a90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21aa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21ab0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21ac0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
21ad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21ae0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65  r->iPage]->intKe
21af0 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65  yLeaf==1 );.  ge
21b00 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
21b10 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72  .  *pSize = pCur
21b20 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
21b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21b40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  _OK;.}../*.** Gi
21b50 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
21b60 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
21b70 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
21b80 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
21b90 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
21ba0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
21bb0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
21bc0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
21bd0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
21be0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
21bf0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
21c00 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
21c10 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
21c20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
21c30 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
21c40 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
21c50 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
21c60 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
21c70 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
21c80 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
21c90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21ca0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
21cb0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
21cc0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
21cd0 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
21ce0 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
21cf0 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
21d00 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
21d10 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
21d20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
21d30 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
21d40 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
21d50 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
21d60 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
21d70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
21d80 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
21d90 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
21da0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
21db0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
21dc0 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
21dd0 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
21de0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
21df0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
21e00 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
21e10 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
21e20 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
21e30 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
21e40 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
21e50 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
21e60 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
21e70 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
21e80 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
21e90 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
21ea0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
21eb0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
21ec0 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
21ed0 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
21ee0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
21ef0 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
21f00 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
21f10 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
21f20 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
21f30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
21f40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21f50 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f70 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
21f80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
21f90 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
21fa0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
21fb0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
21fc0 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
21fd0 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
21fe0 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
21ff0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
22000 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
22010 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
22020 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
22030 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
22040 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
22050 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
22060 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22070 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
22080 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
22090 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
220a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
220b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
220c0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
220d0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
220e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
220f0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
22100 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
22110 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
22120 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
22130 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
22140 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
22150 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
22160 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
22170 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
22180 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
22190 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
221a0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
221b0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
221c0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
221d0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
221e0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
221f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
22200 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22210 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
22220 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
22230 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
22240 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
22250 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
22260 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
22270 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
22280 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
22290 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
222a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
222b0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
222c0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
222d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
222e0 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
222f0 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
22300 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22310 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
22320 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
22330 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
22340 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
22350 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
22360 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22370 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
22380 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
22390 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
223a0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
223b0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
223c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
223d0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
223e0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
223f0 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
22400 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
22410 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
22420 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
22430 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
22440 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
22450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22460 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
22470 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
22480 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
22490 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
224a0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
224b0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
224c0 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
224d0 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
224e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
224f0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
22500 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
22510 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
22520 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
22530 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
22540 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
22550 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
22560 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
22570 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
22580 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
22590 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
225a0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
225b0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
225c0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
225d0 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
225e0 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
225f0 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
22600 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
22610 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
22620 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
22630 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
22640 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
22650 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
22660 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
22670 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
22680 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
22690 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
226a0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
226b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
226c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
226d0 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
226e0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
226f0 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
22700 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
22710 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
22720 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
22730 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
22740 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
22750 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22760 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
22770 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
22780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22790 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
227a0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
227b0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
227c0 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
227d0 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
227e0 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
227f0 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
22800 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
22810 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
22820 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
22830 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
22840 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
22850 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
22860 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
22870 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
22880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22890 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
228a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
228b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
228c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
228d0 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
228e0 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
228f0 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
22900 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
22910 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
22920 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
22930 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
22940 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
22950 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
22960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22970 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
22980 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
22990 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
229a0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
229b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
229c0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
229d0 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
229e0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
229f0 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
22a00 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
22a10 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
22a20 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
22a30 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
22a40 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
22a50 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
22a60 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
22a70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
22a80 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
22a90 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
22aa0 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
22ab0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
22ac0 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
22ad0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
22ae0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
22af0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
22b00 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
22b10 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
22b20 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
22b30 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
22b40 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
22b50 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
22b60 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
22b70 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
22b80 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
22b90 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
22ba0 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
22bb0 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
22bc0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
22bd0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
22be0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
22bf0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
22c00 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
22c10 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
22c20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
22c30 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
22c40 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
22c50 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
22c60 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
22c70 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
22c80 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
22c90 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
22ca0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
22cb0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
22cc0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
22cd0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
22ce0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
22cf0 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
22d00 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
22d10 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
22d20 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
22d30 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
22d40 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
22d50 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
22d60 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
22d70 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
22d80 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
22d90 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
22da0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
22db0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
22dc0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
22dd0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
22de0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
22df0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
22e00 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
22e10 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
22e20 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
22e30 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
22e40 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
22e50 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
22e60 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
22e70 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
22e80 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
22e90 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
22ea0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
22eb0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
22ec0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
22ed0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22ee0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
22ef0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
22f00 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
22f10 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
22f20 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
22f30 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
22f40 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
22f50 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
22f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22f70 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
22f80 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
22f90 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
22fa0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
22fb0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
22fc0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22fe0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
22ff0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
23000 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
23010 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
23020 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23030 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
23040 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
23050 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
23060 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23070 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
23080 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
23090 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
230a0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
230b0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
230c0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
230d0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
230e0 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
230f0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
23100 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
23110 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
23120 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
23130 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64  pBuf;.  int bEnd
23140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23160 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
23170 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
23180 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
23190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
231a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
231b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
231c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
231d0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
231e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
231f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
23200 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23210 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23220 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
23230 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
23240 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73  ;    /* Always s
23250 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e  tart from beginn
23260 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a  ing for eOp==2 *
23270 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  /..  getCellInfo
23280 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
23290 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
232a0 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66  pPayload;.#ifdef
232b0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
232c0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62  VERFLOW_READ.  b
232d0 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74  End = offset+amt
232e0 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  ==pCur->info.nPa
232f0 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20  yload;.#endif.  
23300 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
23310 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
23320 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
23330 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43  if( &aPayload[pC
23340 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
23350 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
23360 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
23370 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ] ){.    /* Tryi
23380 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
23390 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
233a0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
233b0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
233c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
233d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
233e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
233f0 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
23400 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
23410 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
23420 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
23430 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
23440 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
23450 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
23460 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
23470 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23480 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
23490 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
234a0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
234b0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
234c0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
234d0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
234e0 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
234f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
23500 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
23510 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
23520 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
23530 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
23540 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
23550 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
23560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23570 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
23580 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
23590 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
235a0 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
235b0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
235c0 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
235d0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
235e0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
235f0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
23600 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
23610 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
23620 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
23630 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
23640 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
23650 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
23660 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
23670 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
23680 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
23690 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
236a0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
236b0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
236c0 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
236d0 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
236e0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
236f0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
23700 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
23710 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
23720 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
23730 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
23740 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
23750 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
23760 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
23770 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
23780 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
23790 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
237a0 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
237b0 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
237c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
237d0 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
237e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
237f0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
23800 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
23810 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
23820 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
23830 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
23840 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
23850 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
23860 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
23870 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
23880 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
23890 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
238a0 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
238b0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2c  Cur->pBtree->db,
238c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
238d0 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
238e0 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
238f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
23900 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
23910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
23920 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65  OMEM;.        }e
23930 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
23940 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
23950 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
23960 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
23970 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
23980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23990 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
239a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
239b0 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61    memset(pCur->a
239c0 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76  Overflow, 0, nOv
239d0 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29  fl*sizeof(Pgno))
239e0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
239f0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
23a00 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
23a10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
23a20 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
23a30 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
23a40 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
23a50 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
23a60 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
23a70 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
23a80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
23a90 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
23aa0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
23ab0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
23ac0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
23ad0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
23ae0 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26  Ovfl)!=0.     &&
23af0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
23b00 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
23b10 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ].    ){.      i
23b20 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
23b30 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
23b40 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
23b50 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
23b60 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
23b70 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
23b80 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
23b90 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
23ba0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
23bb0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
23bc0 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  {..      /* If r
23bd0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
23be0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
23bf0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
23c00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43  */.      if( (pC
23c10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
23c20 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
23c30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
23c40 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
23c50 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
23c60 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
23c70 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
23c80 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
23c90 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
23ca0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
23cb0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  }..      if( off
23cc0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
23cd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
23ce0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
23cf0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
23d00 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
23d10 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
23d20 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
23d30 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
23d40 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
23d50 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
23d60 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
23d70 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
23d80 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
23d90 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
23da0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
23db0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
23dc0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
23dd0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
23de0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
23df0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
23e00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
23e10 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
23e20 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
23e30 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ray must be allo
23e40 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f  cated because eO
23e50 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  p!=2.        ** 
23e60 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32  here.  If eOp==2
23e70 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30  , then offset==0
23e80 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68   and this branch
23e90 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e   is never taken.
23ea0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
23eb0 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21      assert( eOp!
23ec0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =2 );.        as
23ed0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
23ee0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
23ef0 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
23f00 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
23f10 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
23f20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
23f30 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
23f40 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
23f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23f60 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
23f70 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
23f80 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
23f90 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
23fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
23fb0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
23fc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23fd0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
23fe0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
23ff0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
24000 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
24010 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
24020 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
24030 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
24040 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
24050 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
24060 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
24070 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24080 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
24090 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
240a0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
240b0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
240c0 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
240d0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
240e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
240f0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
24100 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
24110 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24120 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
24130 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
24140 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
24150 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
24160 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
24170 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
24180 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
24190 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
241a0 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
241b0 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
241c0 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
241d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
241e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
241f0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
24200 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
24210 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24220 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
24230 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
24240 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
24250 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
24260 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
24270 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
24280 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
24290 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
242a0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
242b0 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
242c0 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
242d0 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
242e0 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
242f0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
24300 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
24310 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
24320 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
24330 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
24340 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24350 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
24360 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
24370 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
24380 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
24390 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
243a0 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
243b0 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
243c0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
243d0 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
243e0 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
243f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
24400 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
24440 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
24450 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24480 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24490 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
244a0 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
244d0 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
244e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
244f0 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24510 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
24520 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
24530 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
24540 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
24550 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
24560 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
24570 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
24580 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
24590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
245a0 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
245b0 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
245c0 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
245f0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
24600 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
24610 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
24620 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
24630 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
24640 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
24650 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
24680 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
24690 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
246a0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
246b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
246c0 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
246d0 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
246e0 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
246f0 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
24700 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24710 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
24720 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24730 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
24740 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
24750 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
24760 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
24770 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
24780 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24790 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
247a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
247b0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
247c0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
247d0 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
247e0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
247f0 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
24800 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
24810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24830 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
24840 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
24850 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
24860 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
24870 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
24880 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
24890 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
248a0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
248b0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
248c0 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
248d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
248e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
248f0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
24900 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
24910 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
24920 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24930 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
24940 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
24950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24960 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24970 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
24980 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24990 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
249a0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
249b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
249c0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
249d0 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
249e0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
249f0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
24a00 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
24a10 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
24a20 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
24a30 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
24a40 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
24a50 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
24a60 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
24a70 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
24a80 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
24a90 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
24aa0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
24ab0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
24ac0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
24ad0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
24ae0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
24af0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
24b00 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
24b10 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
24b20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
24b30 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
24b40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24b50 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
24b60 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
24b70 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
24b80 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
24b90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24ba0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24bb0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24bc0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24bd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24be0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
24bf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24c00 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
24c10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24c20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
24c30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24c40 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24c50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
24c60 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
24c70 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
24c80 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
24c90 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
24ca0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
24cb0 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
24cc0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
24cd0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
24ce0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
24cf0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
24d00 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
24d10 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
24d20 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
24d30 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
24d40 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
24d50 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
24d60 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
24d70 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
24d80 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
24d90 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
24da0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
24db0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
24dc0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
24dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24de0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
24df0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
24e00 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
24e10 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
24e20 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24e30 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
24e40 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
24e50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
24e60 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
24e70 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
24e80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
24e90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24ea0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24eb0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
24ec0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
24ed0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
24ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
24ef0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24f00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24f10 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
24f20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
24f30 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
24f40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
24f50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24f60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24f70 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
24f80 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24f90 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
24fa0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
24fb0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
24fc0 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
24fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24fe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24ff0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
25000 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
25010 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
25020 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
25030 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25040 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
25050 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
25060 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
25070 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
25080 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
25090 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
250a0 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
250b0 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
250c0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
250d0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
250e0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
250f0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
25100 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
25110 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
25120 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
25130 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
25140 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
25150 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
25160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25170 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
25180 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
25190 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
251a0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
251b0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
251c0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
251d0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
251e0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
251f0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
25200 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
25210 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
25220 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
25230 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
25240 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
25250 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
25260 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
25270 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
25280 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
25290 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
252a0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
252b0 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
252c0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
252d0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
252e0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
252f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25300 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
25310 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
25320 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
25330 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
25340 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
25350 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
25360 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
25370 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
25380 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
25390 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
253a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
253b0 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
253c0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
253d0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
253e0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
253f0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
25400 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
25410 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
25420 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
25430 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25440 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
25450 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
25460 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
25470 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
25480 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25490 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
254a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
254b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
254c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
254d0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
254e0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
254f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
25500 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25510 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25520 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25530 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
25540 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25550 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
25560 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25570 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
25580 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e    *pAmt = pCur->
25590 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72  info.nLocal;.  r
255a0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
255b0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
255c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
255d0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
255e0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
255f0 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
25600 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
25610 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
25620 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
25630 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
25640 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
25650 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
25660 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25670 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
25680 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
25690 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
256a0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
256b0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
256c0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
256d0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
256e0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
256f0 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
25700 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
25710 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
25720 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
25730 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
25740 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
25750 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
25760 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
25770 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
25780 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
25790 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
257a0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
257b0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
257c0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
257d0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
257e0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
257f0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
25800 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
25810 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
25820 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
25830 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
25840 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
25850 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
25860 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
25870 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
25880 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
25890 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
258a0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
258b0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
258c0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
258d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
258e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
258f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
25900 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
25910 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
25920 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25930 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
25940 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
25950 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
25960 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
25970 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
25980 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
25990 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
259a0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
259b0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
259c0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
259d0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
259e0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
259f0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
25a00 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
25a10 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
25a20 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
25a30 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
25a40 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
25a50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25a60 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
25a70 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
25a80 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
25a90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
25aa0 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
25ab0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25ad0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25ae0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25af0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25b00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25b10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
25b20 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
25b30 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
25b40 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
25b50 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
25b60 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
25b70 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
25b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25ba0 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
25bb0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
25bc0 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
25bd0 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  wPage,.         
25be0 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
25bf0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
25c00 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
25c10 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
25c20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
25c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
25c40 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
25c50 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
25c60 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
25c70 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
25c80 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
25c90 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
25ca0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25cb0 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
25cc0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
25cd0 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61  l);.  if( pNewPa
25ce0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
25cf0 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
25d00 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
25d10 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
25d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25d30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25d50 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  OK;.}..#if 0./*.
25d60 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
25d70 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
25d80 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
25d90 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
25da0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
25db0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
25dc0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
25dd0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
25de0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
25df0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
25e00 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
25e10 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
25e20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
25e30 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
25e40 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
25e50 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
25e60 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
25e70 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
25e80 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25e90 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
25ea0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
25eb0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
25ec0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
25ed0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
25ee0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
25ef0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
25f00 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
25f10 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
25f20 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
25f30 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
25f40 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
25f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
25f60 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
25f70 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
25f80 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
25f90 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
25fa0 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
25fb0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
25fc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
25fd0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
25fe0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
25ff0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
26000 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
26010 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
26020 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
26030 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
26040 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
26050 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
26060 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
26070 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
26080 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
26090 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
260a0 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
260b0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
260c0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
260d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
260e0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
260f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
26100 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26110 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26130 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26140 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26150 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26160 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26170 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26180 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20  r->iPage] );..  
26190 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73  /* UPDATE: It is
261a0 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
261b0 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69  le for the condi
261c0 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74  tion tested by t
261d0 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62  he assert.  ** b
261e0 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75  elow to be untru
261f0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
26200 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
26210 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  t. This can occu
26220 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75  r if.  ** one cu
26230 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65  rsor has modifie
26240 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77  d page pParent w
26250 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65  hile a reference
26260 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a   to it is held .
26270 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64    ** by a second
26280 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63   cursor. Which c
26290 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
262a0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
262b0 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69  is linked.  ** i
262c0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
262d0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
262e0 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  re in a corrupt 
262f0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69  database.  */.#i
26300 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65  f 0.  assertPare
26310 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
26320 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26330 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
26340 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26350 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
26360 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26370 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
26380 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65    );.#endif.  te
26390 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
263a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
263b0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
263c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
263d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
263e0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
263f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26400 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
26410 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
26420 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
26430 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
26440 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
26450 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
26460 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  fl);.}../*.** Mo
26470 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
26480 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
26490 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
264a0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
264b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
264c0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
264d0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
264e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
264f0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
26500 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
26510 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
26520 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
26530 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
26540 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
26550 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
26560 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
26570 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
26580 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
26590 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
265a0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
265b0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
265c0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
265d0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
265e0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
265f0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
26600 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
26610 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
26620 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
26630 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
26640 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
26650 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
26660 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
26670 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
26680 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
26690 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
266a0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
266b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
266c0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
266d0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
266e0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
266f0 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
26700 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
26710 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
26720 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
26730 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
26740 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
26750 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
26760 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
26770 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
26780 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
26790 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
267a0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
267b0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
267c0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
267d0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
267e0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
267f0 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
26800 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
26810 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
26820 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
26830 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
26840 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
26850 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
26860 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
26870 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
26880 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
26890 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
268a0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
268b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
268c0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
268d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
268e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
268f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26900 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
26910 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
26920 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
26930 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26940 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
26950 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26970 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
26980 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26990 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
269a0 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
269b0 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
269c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
269d0 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
269e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
269f0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
26a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
26a10 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
26a20 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
26a30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
26a40 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
26a50 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
26a60 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
26a70 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
26a80 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61  r->iPage ) relea
26a90 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
26aa0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
26ab0 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  -]);.  }else if(
26ac0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
26ad0 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
26ae0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
26af0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
26b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
26b20 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
26b30 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
26b40 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
26b50 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
26b60 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
26b70 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
26b80 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
26b90 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
26ba0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
26bb0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
26bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26bd0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
26be0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
26bf0 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
26c00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
26c10 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
26c20 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
26c30 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
26c40 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
26c50 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
26c60 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
26c70 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
26c80 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
26c90 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
26ca0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
26cb0 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
26cc0 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
26cd0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
26ce0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
26cf0 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
26d00 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
26d10 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
26d20 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
26d30 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
26d40 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
26d50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
26d60 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
26d70 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
26d80 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
26d90 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
26da0 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
26db0 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
26dc0 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
26dd0 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
26de0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26df0 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
26e00 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
26e10 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
26e20 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
26e30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26e40 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
26e50 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
26e60 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
26e70 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
26e80 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
26e90 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
26ea0 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
26eb0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
26ec0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
26ed0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
26ee0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
26ef0 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
26f00 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
26f10 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
26f20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26f30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26f40 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61  ;.  }..  pCur->a
26f50 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
26f60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
26f70 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
26f80 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
26f90 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
26fa0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
26fb0 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52  Ovfl);..  if( pR
26fc0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
26fd0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
26fe0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
26ff0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
27000 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
27010 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
27020 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
27030 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
27040 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27050 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
27060 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
27070 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
27080 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
27090 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
270a0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
270b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
270c0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
270d0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
270e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
270f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
27100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
27120 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27130 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
27140 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
27150 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
27160 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
27170 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
27180 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
27190 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
271a0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
271b0 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
271c0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
271d0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
271e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
271f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
27200 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
27210 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
27220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27230 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27240 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27250 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27290 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
272a0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
272b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
272c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
272d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
272e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
272f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
27300 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
27310 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
27320 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
27330 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
27340 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
27350 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
27360 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
27370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
27390 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
273a0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
273b0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
273c0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
273d0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
273e0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
273f0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
27400 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
27410 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
27420 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
27430 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
27440 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
27450 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
27460 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
27470 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
27480 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
27490 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
274a0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
274b0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
274c0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
274d0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
274e0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
274f0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
27500 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
27510 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
27520 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
27530 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
27540 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
27550 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
27560 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
27570 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27580 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
27590 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
275a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
275b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
275c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
275d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
275e0 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
275f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27600 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
27610 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
27620 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
27630 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
27640 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27650 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
27660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27670 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
27680 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
27690 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
276a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
276b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
276c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
276d0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
276e0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
276f0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
27700 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
27710 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
27720 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27730 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
27740 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27750 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
27760 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
27770 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27780 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
27790 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
277a0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
277b0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
277c0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
277d0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
277e0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
277f0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
27800 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
27810 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27820 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
27830 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
27840 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
27850 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27860 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27880 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27890 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
278a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
278b0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
278c0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
278d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
278e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
278f0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27900 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27910 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27920 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
27930 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27940 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
27950 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
27960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27970 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27980 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27990 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
279a0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
279b0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
279c0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
279d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
279e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
279f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27a00 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27a10 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
27a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
27a30 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
27a40 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
27a50 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
27a60 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
27a70 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
27a80 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
27a90 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
27aa0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
27ab0 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
27ac0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
27ad0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
27ae0 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
27af0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27b00 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27b10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27b20 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
27b30 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
27b40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
27b50 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
27b60 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
27b70 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
27b80 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
27b90 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
27ba0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
27bb0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
27bc0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
27bd0 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
27be0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
27bf0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
27c00 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
27c10 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
27c20 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
27c30 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
27c40 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27c50 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
27c60 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
27c70 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
27c80 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
27c90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27ca0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
27cb0 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
27cc0 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
27cd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27ce0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27cf0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
27d00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27d10 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
27d20 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
27d30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27d40 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
27d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27d60 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
27d70 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
27d80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
27d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
27da0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
27db0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
27dc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27dd0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
27de0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
27df0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27e00 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
27e10 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
27e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
27e30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27e40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27e50 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
27e60 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
27e70 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
27e80 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
27e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27ea0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
27eb0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
27ec0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
27ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
27ee0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
27ef0 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
27f00 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a      }.   .    }.
27f10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27f20 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
27f30 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
27f40 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
27f50 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
27f60 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
27f70 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
27f80 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
27f90 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
27fa0 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
27fb0 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
27fc0 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
27fd0 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
27fe0 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
27ff0 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
28000 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
28010 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
28020 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
28030 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
28040 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
28050 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
28060 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
28070 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
28080 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
28090 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
280a0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
280b0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
280c0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
280d0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
280e0 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
280f0 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
28100 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
28110 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
28120 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
28130 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
28140 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
28150 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
28160 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
28170 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
28180 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
28190 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
281a0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
281b0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
281c0 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
281d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
281e0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
281f0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
28200 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
28210 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
28220 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
28230 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
28240 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
28250 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
28260 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
28270 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
28280 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
28290 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
282a0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
282b0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
282c0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
282d0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
282e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
28310 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
28320 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
28330 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
28340 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
28350 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
28360 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
28370 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
28380 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
28390 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
283a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
283b0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
283c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
283d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
283e0 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
283f0 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
28400 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
28410 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
28420 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
28430 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
28440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
28450 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
28460 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
28470 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
28480 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
28490 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
284a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
284c0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
284d0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
284e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
284f0 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
28500 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
28510 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28520 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28530 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28540 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
28550 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28560 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28570 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
28580 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
28590 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
285a0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
285b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
285c0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
285d0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
285e0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
285f0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
28600 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
28610 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
28620 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
28630 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28640 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
28650 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28660 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
28670 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  )!=0.   && pCur-
28680 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
28690 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
286a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
286b0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
286c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
286d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
286e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
286f0 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
28700 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
28710 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e  )!=0 && pCur->in
28720 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
28730 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28740 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
28750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28760 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
28770 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
28780 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
28790 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
287a0 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
287b0 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
287c0 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
287d0 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
287e0 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
287f0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
28800 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
28810 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
28820 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
28830 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
28840 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
28850 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
28860 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
28870 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
28880 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
28890 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
288a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
288b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
288c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
288d0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
288e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
288f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28900 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
28910 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28920 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
28930 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
28940 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28950 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
28960 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28970 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
28980 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
28990 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
289a0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
289b0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
289c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
289d0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
289e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
289f0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
28a00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28a10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
28a20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28a30 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
28a40 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
28a50 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
28a60 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
28a70 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
28a80 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
28a90 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
28aa0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28ab0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
28ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
28ae0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
28af0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
28b00 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
28b10 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
28b20 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
28b30 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
28b40 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
28b50 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
28b60 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
28b70 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
28b80 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
28b90 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
28ba0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
28bb0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
28bc0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
28bd0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
28be0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
28bf0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
28c00 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
28c10 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
28c20 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
28c30 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
28c40 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
28c50 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
28c60 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
28c70 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
28c80 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
28c90 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
28ca0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
28cb0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
28cc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
28cd0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
28ce0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
28cf0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
28d00 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
28d10 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
28d20 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
28d30 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
28d40 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
28d50 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
28d60 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
28d70 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
28d80 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
28d90 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
28da0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
28db0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
28dc0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
28dd0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
28de0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
28df0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
28e00 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
28e10 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
28e20 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
28e30 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
28e40 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
28e50 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
28e60 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
28e70 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
28e80 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
28e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
28ea0 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
28eb0 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
28ec0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
28ed0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
28ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28ef0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
28f00 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
28f10 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
28f20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
28f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
28f40 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
28f50 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
28f60 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
28f70 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
28f80 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
28f90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
28fa0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
28fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
28fc0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
28fd0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
28fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28ff0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
29000 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
29010 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
29020 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
29030 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
29040 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
29050 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
29060 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
29070 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29080 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
290a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
290b0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
290c0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
290d0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
290e0 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
290f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29100 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
29110 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29120 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
29130 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
29140 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
29150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29160 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
29170 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
29180 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
29190 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
291a0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
291b0 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
291c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
291d0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
291e0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
291f0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
29200 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
29210 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
29220 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20  trSize;..       
29230 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
29240 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
29250 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
29260 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
29270 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
29280 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
29290 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
292a0 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
292b0 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
292c0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
292d0 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
292e0 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
292f0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
29300 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
29310 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
29320 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
29330 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
29340 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
29350 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
29360 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
29370 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
29380 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
29390 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
293a0 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
293b0 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
293c0 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
293d0 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
293e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
293f0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
29400 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29410 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
29420 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
29430 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
29440 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
29450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29460 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
29470 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
29480 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
29490 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
294a0 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
294b0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
294c0 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
294d0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
294e0 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
294f0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
29500 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
29510 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
29520 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
29530 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
29540 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
29550 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
29560 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
29570 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
29580 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
29590 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
295a0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
295b0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
295c0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
295d0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
295e0 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
295f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
29600 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
29610 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
29620 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
29630 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
29640 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
29650 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
29660 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
29670 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29680 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
29690 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
296a0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
296b0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
296c0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
296d0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
296e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
296f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29700 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
29710 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
29720 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
29730 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
29740 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
29750 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
29760 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
29770 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
29780 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
29790 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
297a0 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
297b0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
297c0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
297d0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
297e0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
297f0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
29800 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
29810 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
29820 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
29830 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
29840 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
29850 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
29860 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
29870 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
29880 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
29890 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
298a0 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
298b0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
298c0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
298d0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
298e0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
298f0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
29900 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
29910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29920 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
29930 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29940 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29950 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29960 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
29970 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29980 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
29990 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
299a0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
299b0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
299c0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
299d0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
299e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
299f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
29a00 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
29a10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
29a20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
29a30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29a40 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
29a50 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
29a60 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
29a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
29a80 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
29a90 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
29aa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
29ac0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
29ad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
29ae0 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
29af0 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
29b00 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
29b10 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
29b20 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
29b30 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
29b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
29b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
29b60 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
29b70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
29b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
29b90 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
29ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29bb0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
29bc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
29bd0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
29be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29bf0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
29c00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29c10 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29c20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29c30 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
29c40 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
29c50 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
29c60 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
29c70 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
29c80 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
29c90 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
29ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
29cb0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
29cc0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
29cd0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
29ce0 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
29cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29d00 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
29d10 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
29d20 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
29d30 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
29d40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
29d50 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
29d60 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
29d80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29d90 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
29da0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29db0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
29dc0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29dd0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
29de0 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
29df0 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
29e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29e10 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
29e20 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
29e30 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
29e40 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
29e50 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
29e60 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
29e70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
29e80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
29e90 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
29ea0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
29eb0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
29ec0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
29ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
29ee0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29ef0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
29f00 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
29f10 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
29f20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
29f30 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
29f40 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
29f50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
29f60 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
29f70 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
29f80 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
29f90 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
29fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
29fb0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
29fc0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
29fd0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
29fe0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
29ff0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2a000 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a010 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2a020 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2a030 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2a040 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2a050 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2a060 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2a070 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2a080 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2a090 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2a0a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2a0b0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2a0c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a0d0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2a0e0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2a0f0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2a100 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2a110 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a120 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2a130 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2a140 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2a150 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2a160 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2a170 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2a180 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2a190 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2a1a0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2a1b0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2a1c0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2a1d0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2a1e0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2a1f0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2a200 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2a210 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2a220 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2a230 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2a240 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2a250 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2a260 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2a270 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2a280 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2a290 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2a2a0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2a2b0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2a2c0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2a2d0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2a2e0 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2a2f0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2a300 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2a310 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2a320 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2a330 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2a340 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2a350 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2a360 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2a370 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2a380 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2a390 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2a3a0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2a3b0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2a3c0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2a3d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2a3e0 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2a3f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2a400 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2a410 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2a420 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2a430 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2a440 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2a450 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2a460 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2a470 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2a480 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2a490 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2a4a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2a4b0 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2a4c0 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2a4d0 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2a4e0 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2a4f0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2a500 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2a510 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2a520 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2a530 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2a540 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2a550 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2a560 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2a570 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2a580 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2a590 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2a5a0 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2a5b0 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2a5c0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2a5d0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2a5e0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2a5f0 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2a600 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2a610 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2a620 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2a630 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2a640 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2a650 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2a660 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2a670 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2a680 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2a690 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2a6a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2a6b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2a6c0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2a6d0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2a6e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2a6f0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2a700 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2a710 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2a720 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2a730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2a740 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2a750 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2a760 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2a770 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2a780 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2a790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a7a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2a7b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2a7c0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2a7d0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2a7e0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2a7f0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2a800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2a810 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2a820 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2a830 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a840 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a850 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2a860 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2a870 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2a880 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2a890 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2a8a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2a8b0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2a8c0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2a8d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2a8e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2a900 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2a910 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2a920 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a930 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a940 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2a950 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a960 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2a970 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2a980 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2a990 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2a9a0 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2a9b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2a9c0 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2a9d0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2a9e0 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2a9f0 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2aa00 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2aa10 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2aa20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2aa30 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2aa40 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2aa50 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2aa60 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2aa70 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2aa80 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2aa90 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2aaa0 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2aab0 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2aac0 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2aad0 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2aae0 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2aaf0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2ab00 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2ab10 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2ab20 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ab30 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2ab40 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2ab50 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ab60 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ab70 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2ab80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2ab90 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2aba0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2abb0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2abc0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2abd0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2abe0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2abf0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2ac00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ac10 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2ac20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ac30 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2ac40 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2ac50 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2ac60 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2ac70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2ac80 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2ac90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2aca0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2acb0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2acc0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2acd0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2ace0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2acf0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2ad00 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2ad10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ad20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2ad30 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2ad40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ad50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2ad60 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2ad70 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2ad80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ad90 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2ada0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2adb0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2adc0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2add0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2ade0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2adf0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2ae00 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2ae10 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2ae20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2ae30 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2ae40 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ae50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2ae60 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ae70 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2ae80 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2ae90 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2aea0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2aeb0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2aec0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2aed0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2aee0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2aef0 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2af00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2af10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2af20 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2af30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2af40 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2af50 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2af60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2af70 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2af80 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2af90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2afa0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2afb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2afc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2afd0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2afe0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2aff0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2b000 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2b010 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2b020 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2b030 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2b040 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2b050 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2b060 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2b070 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2b080 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2b090 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b0a0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2b0b0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2b0c0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2b0d0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2b0e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2b0f0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2b100 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2b110 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2b120 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2b130 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2b140 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2b150 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2b160 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2b170 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2b180 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2b190 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2b1a0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2b1b0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2b1c0 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2b1d0 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2b1e0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2b1f0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2b200 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2b210 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2b220 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2b230 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2b240 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2b250 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2b260 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2b270 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2b280 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2b290 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2b2a0 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2b2b0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2b2c0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2b2d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2b2e0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2b2f0 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2b300 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2b310 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2b320 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2b330 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2b340 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2b350 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2b360 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2b370 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2b380 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2b390 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2b3a0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2b3b0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2b3c0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2b3d0 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2b3e0 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2b3f0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2b400 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2b410 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2b420 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2b430 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2b440 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2b450 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2b460 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2b470 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2b480 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2b490 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2b4a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2b4b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2b4c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2b4d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2b4e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2b4f0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2b500 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2b510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b520 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2b530 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2b540 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2b550 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2b560 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2b570 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2b580 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2b590 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2b5a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2b5b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2b5c0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2b5d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2b5e0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2b5f0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2b600 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2b610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b620 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2b630 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2b640 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2b650 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2b660 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2b670 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b680 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2b690 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2b6a0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2b6b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b6c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2b6d0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2b6e0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2b6f0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2b700 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2b710 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2b720 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b730 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2b740 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2b750 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b770 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2b780 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2b790 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2b7a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2b7b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2b7c0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2b7d0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2b7e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b7f0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2b800 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b810 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
2b820 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2b830 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2b840 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2b850 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2b870 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2b880 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2b890 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2b8a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b8b0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
2b8c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2b8d0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2b8e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b8f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b900 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2b910 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2b920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b930 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2b940 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2b950 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2b960 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2b970 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
2b980 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2b990 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
2b9a0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2b9b0 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2b9c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b9d0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2b9e0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2b9f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ba00 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2ba10 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2ba20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ba30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ba40 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2ba50 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2ba60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2ba70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ba80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2ba90 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
2baa0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
2bab0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2bac0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73  nt *pRes){.  ass
2bad0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2bae0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2baf0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2bb00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2bb10 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2bb20 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2bb30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2bb40 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2bb50 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2bb60 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2bb70 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2bb80 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2bb90 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2bba0 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2bbb0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2bbc0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2bbd0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2bbe0 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2bbf0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bc00 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2bc10 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2bc20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2bc30 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2bc40 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2bc50 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2bc60 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2bc70 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2bc80 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2bc90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2bca0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2bcb0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2bcc0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2bcd0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2bce0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2bcf0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2bd00 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2bd10 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2bd20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2bd30 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2bd40 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2bd50 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2bd60 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2bd70 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2bd80 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2bd90 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2bda0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2bdb0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2bdc0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2bdd0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2bde0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2bdf0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2be00 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2be10 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2be20 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2be30 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
2be40 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
2be50 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
2be60 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2be70 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
2be80 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2be90 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
2bea0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
2beb0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
2bec0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2bed0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2bee0 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2bef0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2bf00 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2bf10 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2bf20 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2bf30 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2bf40 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2bf50 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2bf60 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2bf70 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2bf80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2bf90 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2bfa0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2bfb0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2bfc0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2bfd0 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2bfe0 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2bff0 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2c000 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2c010 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2c020 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2c030 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2c040 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2c050 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2c060 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2c070 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2c080 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2c090 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2c0a0 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2c0b0 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2c0c0 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2c0d0 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2c0e0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2c0f0 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2c100 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2c110 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2c120 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2c130 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2c140 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2c150 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2c160 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2c170 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2c180 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2c190 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2c1a0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2c1b0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2c1c0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2c1d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2c1e0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2c1f0 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2c200 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2c210 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2c220 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c240 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2c250 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2c260 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2c270 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2c280 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2c290 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2c2a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2c2b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2c2c0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2c2d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2c2e0 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2c2f0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2c300 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2c310 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2c320 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2c330 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2c340 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2c350 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2c360 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2c370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c380 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2c390 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2c3a0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2c3b0 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2c3c0 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2c3d0 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2c3e0 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2c3f0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2c400 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2c410 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2c420 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2c430 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2c440 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2c450 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2c460 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2c470 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2c480 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2c490 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2c4a0 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2c4b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c4c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2c4d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2c4e0 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2c4f0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2c500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c510 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c520 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2c530 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2c540 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2c550 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2c560 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2c570 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2c580 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2c590 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2c5a0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2c5b0 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2c5c0 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2c5d0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2c5e0 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2c5f0 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2c600 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2c610 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2c620 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2c630 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2c640 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2c650 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2c660 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2c670 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2c680 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2c690 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2c6a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c6b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2c6c0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2c6d0 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2c6e0 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2c6f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2c700 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2c710 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2c720 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2c730 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2c740 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2c750 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2c760 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2c770 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2c780 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2c790 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2c7a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2c7b0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2c7c0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2c7d0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2c7e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2c7f0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2c800 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2c810 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2c820 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2c830 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2c840 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2c850 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2c860 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2c870 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2c880 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2c890 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2c8a0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2c8b0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2c8c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c8d0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2c8e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2c8f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2c900 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2c910 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2c920 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
2c930 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
2c940 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
2c950 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
2c960 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
2c970 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
2c980 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
2c990 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
2c9a0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
2c9b0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
2c9c0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
2c9d0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
2c9e0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2c9f0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2ca00 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
2ca10 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
2ca20 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
2ca30 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2ca40 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2ca50 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
2ca60 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
2ca70 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
2ca80 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
2ca90 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
2caa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2cab0 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
2cac0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
2cad0 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2cae0 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
2caf0 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
2cb00 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
2cb10 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2cb20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
2cb30 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
2cb40 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
2cb50 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
2cb60 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
2cb70 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2cb80 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
2cb90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
2cba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2cbb0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2cbc0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
2cbd0 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
2cbe0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2cbf0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
2cc00 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2cc10 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2cc20 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
2cc30 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
2cc40 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
2cc50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2cc60 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
2cc70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2cc80 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2cc90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2cca0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2ccb0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
2ccc0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2ccd0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
2cce0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2ccf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2cd00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2cd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2cd20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2cd30 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2cd40 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2cd50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2cd60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2cd70 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2cd80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2cd90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2cda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2cdb0 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2cdc0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2cdd0 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2cde0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2cdf0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2ce00 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2ce10 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2ce20 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2ce30 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2ce40 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2ce50 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2ce60 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2ce70 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2ce80 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2ce90 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2cea0 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2ceb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2cec0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2ced0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2cee0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2cef0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2cf00 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2cf10 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2cf20 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2cf30 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2cf40 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2cf50 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2cf60 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2cf70 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2cf80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2cf90 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2cfa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2cfb0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2cfc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2cfd0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2cfe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cff0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2d000 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2d010 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d020 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d030 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d040 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d050 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2d060 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2d070 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2d080 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2d090 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2d0a0 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2d0b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2d0c0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2d0d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2d0e0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2d0f0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2d100 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2d110 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2d120 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2d130 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d140 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2d150 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d160 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2d170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d180 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2d190 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2d1a0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2d1b0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2d1c0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2d1d0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2d1e0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2d1f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2d200 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2d210 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2d220 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2d230 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2d240 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2d250 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2d260 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2d270 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2d280 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2d290 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2d2a0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d2b0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2d2c0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2d2d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d2e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2d2f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2d300 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d310 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2d320 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d330 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2d340 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2d350 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d360 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2d370 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2d380 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d390 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d3a0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d3b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d3c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d3d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d3e0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2d3f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d400 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d410 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d420 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d430 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d450 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2d460 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2d470 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2d480 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d4b0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2d4c0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2d4d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2d4e0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2d4f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2d500 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2d510 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2d520 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2d530 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2d540 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2d550 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2d560 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2d570 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2d580 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2d590 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2d5a0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2d5b0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2d5c0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2d5d0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2d5e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2d5f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2d600 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2d610 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d620 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2d630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2d640 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2d650 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2d660 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2d670 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2d680 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2d690 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2d6a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d6b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d6c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d6d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2d6e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d6f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d700 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2d710 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2d720 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2d730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d740 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2d750 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2d760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2d770 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d780 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2d790 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2d7a0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2d7b0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2d7c0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2d7d0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2d7e0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2d7f0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2d800 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2d810 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2d820 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2d830 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2d840 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2d850 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2d860 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2d870 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2d880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2d890 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d8a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d8b0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2d8c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2d8d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2d8e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2d8f0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2d900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d920 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2d930 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2d940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2d950 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2d960 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d970 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d990 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2d9a0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2d9b0 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2d9c0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2d9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d9e0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2d9f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2da00 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2da10 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2da20 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2da30 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2da40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2da50 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2da60 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2da70 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2da80 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2da90 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2daa0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2dab0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2dac0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2dad0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2dae0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2daf0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2db00 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2db10 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2db20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2db30 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2db40 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2db50 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2db60 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2db70 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2db80 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2db90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2dba0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2dbc0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2dbe0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2dbf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2dc00 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2dc10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2dc20 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2dc30 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2dc40 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2dc50 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2dc60 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2dc70 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2dc80 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2dc90 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2dca0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2dcb0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2dcc0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2dcd0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2dce0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2dcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd00 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2dd20 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2dd30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dd40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2dd50 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2dd60 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2dd70 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2dd80 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2dd90 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2dda0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2ddb0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2ddc0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2ddd0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2dde0 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2ddf0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2de00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2de10 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2de20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2de30 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2de40 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2de50 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2de60 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2de70 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2de80 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2de90 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2dea0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2deb0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2dec0 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2ded0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2dee0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2def0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2df00 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2df10 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2df20 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2df30 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2df50 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2df60 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2df70 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2df80 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2df90 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2dfa0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2dfb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2dfc0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2dfd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2dfe0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2dff0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2e000 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2e010 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2e020 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2e030 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2e040 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2e050 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2e060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e070 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2e080 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2e090 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2e0a0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2e0b0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2e0c0 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2e0d0 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
2e0e0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2e0f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2e100 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2e110 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
2e120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e140 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e150 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2e160 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2e170 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2e1a0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2e1b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e1c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2e1d0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2e1e0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2e1f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e200 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2e210 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
2e220 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2e230 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
2e240 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
2e250 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2e260 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
2e270 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
2e280 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
2e290 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
2e2a0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
2e2b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2e2c0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
2e2d0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
2e2e0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
2e2f0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
2e300 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2e310 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
2e320 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
2e330 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
2e340 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
2e350 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
2e360 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
2e370 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
2e380 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
2e390 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
2e3a0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2e3b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
2e3c0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
2e3d0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2e3e0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
2e3f0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
2e400 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
2e410 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
2e420 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
2e430 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
2e440 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2e450 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
2e460 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
2e470 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
2e480 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
2e490 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
2e4a0 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
2e4b0 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
2e4c0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2e4d0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
2e4e0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
2e4f0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
2e500 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2e510 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
2e520 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
2e530 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
2e540 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
2e550 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
2e560 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
2e570 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
2e580 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2e590 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
2e5a0 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
2e5b0 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
2e5c0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
2e5d0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
2e5e0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
2e5f0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
2e600 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
2e610 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
2e620 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
2e630 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
2e640 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
2e650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e660 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
2e670 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
2e680 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2e690 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
2e6a0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2e6b0 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
2e6c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e6d0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2e6e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2e6f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e700 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2e710 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2e720 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2e730 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2e740 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2e750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e760 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e770 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2e780 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2e790 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2e7a0 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2e7b0 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2e7c0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2e7d0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2e7e0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2e7f0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2e800 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2e810 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2e820 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2e830 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2e840 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2e850 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2e860 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2e870 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2e880 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2e890 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2e8a0 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2e8b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2e8c0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2e8d0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2e8e0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2e8f0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2e900 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2e910 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2e920 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2e930 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2e940 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2e950 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2e960 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2e970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2e990 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2e9a0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2e9b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2e9c0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2e9d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2e9e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2e9f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2ea00 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2ea10 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2ea20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2ea30 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2ea40 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2ea50 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2ea60 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2ea70 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2ea80 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2ea90 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2eaa0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2eab0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2eac0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2ead0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2eae0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2eaf0 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2eb00 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2eb10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2eb20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2eb30 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2eb40 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2eb50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2eb60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2eb70 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2eb80 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2eb90 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2eba0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2ebb0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2ebc0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2ebd0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2ebe0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ebf0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2ec00 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2ec10 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2ec20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2ec30 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2ec40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ec50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ec60 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2ec70 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2ec80 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2ec90 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2eca0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
2ecb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2ecc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ecd0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2ece0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2ecf0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2ed00 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2ed10 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2ed20 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2ed30 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2ed40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2ed50 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2ed60 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2ed70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2ed80 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2ed90 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2eda0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2edb0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2edc0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2edd0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2ede0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2edf0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2ee00 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2ee10 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2ee20 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2ee30 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2ee40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2ee50 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2ee60 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2ee70 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2ee80 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2ee90 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2eea0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2eeb0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2eec0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2eed0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2eee0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2eef0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2ef00 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2ef10 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2ef20 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2ef30 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2ef40 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2ef50 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2ef60 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2ef70 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2ef80 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2ef90 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2efa0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2efb0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2efc0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2efd0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2efe0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2eff0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2f000 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2f010 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f030 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2f040 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2f050 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2f060 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2f070 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2f080 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2f090 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2f0a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2f0b0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f0d0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2f0e0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2f0f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2f120 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2f130 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f150 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2f160 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2f170 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2f180 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f190 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2f1a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2f1b0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2f1c0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2f1d0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2f1e0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2f1f0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2f200 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2f210 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2f220 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2f230 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2f240 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2f250 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2f260 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2f270 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2f280 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2f290 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2f2a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f2b0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f2c0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2f2d0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2f2e0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2f2f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f300 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2f310 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2f320 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2f330 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2f340 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2f350 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2f360 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2f370 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2f380 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2f390 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2f3a0 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2f3b0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2f3c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2f3d0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2f3e0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2f3f0 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2f400 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2f410 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
2f420 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2f430 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2f440 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f450 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2f460 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2f470 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2f480 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2f490 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2f4a0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2f4b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2f4c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2f4d0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2f4e0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2f4f0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2f500 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2f510 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2f520 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2f530 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2f540 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2f550 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2f560 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2f570 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2f580 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2f590 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2f5a0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2f5b0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2f5c0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2f5d0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2f5e0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2f5f0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2f600 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2f610 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2f620 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2f630 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2f640 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2f650 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2f660 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2f670 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2f680 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2f690 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2f6a0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2f6b0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2f6c0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2f6d0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2f6e0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2f6f0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2f700 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2f710 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2f720 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2f730 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2f740 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2f750 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2f760 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2f770 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2f780 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2f790 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2f7a0 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2f7b0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2f7c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f7d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2f7e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2f7f0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2f800 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2f810 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2f830 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2f840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2f850 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2f860 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2f870 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2f880 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2f890 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2f8a0 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2f8b0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2f8c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2f8d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f8e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2f8f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2f900 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2f910 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2f920 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2f930 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2f940 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2f950 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2f960 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2f970 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2f980 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2f990 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2f9a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2f9b0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2f9c0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2f9d0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2f9e0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2f9f0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2fa00 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2fa10 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2fa20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2fa30 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2fa40 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2fa50 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2fa60 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2fa70 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2fa80 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2fa90 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2faa0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2fab0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2fac0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2fad0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2fae0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2faf0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2fb00 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2fb10 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2fb20 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2fb30 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2fb40 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2fb50 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2fb60 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2fb70 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2fb80 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2fb90 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2fba0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2fbb0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2fbc0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2fbd0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2fbe0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2fbf0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2fc00 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2fc10 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2fc20 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2fc30 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2fc40 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2fc50 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2fc60 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2fc70 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2fc80 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fc90 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
2fca0 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
2fcb0 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
2fcc0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2fcd0 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
2fce0 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
2fcf0 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
2fd00 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
2fd10 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
2fd20 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
2fd30 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
2fd40 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
2fd50 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
2fd60 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
2fd70 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
2fd80 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
2fd90 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
2fda0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2fdb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fdc0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2fdd0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fde0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fdf0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2fe00 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2fe10 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
2fe20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2fe30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2fe40 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
2fe50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2fe60 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
2fe70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
2fe80 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
2fe90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2fea0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2feb0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2fec0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2fed0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2fee0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2fef0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2ff00 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2ff10 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2ff20 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2ff30 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2ff40 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2ff50 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2ff60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2ff70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2ff80 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2ff90 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2ffa0 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2ffb0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2ffc0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2ffd0 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2ffe0 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2fff0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
30000 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
30010 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
30020 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
30030 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
30040 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
30050 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
30060 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
30070 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
30080 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
30090 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
300a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
300b0 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
300c0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
300d0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
300e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
300f0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
30100 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
30110 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
30120 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
30130 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
30140 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
30150 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30160 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30170 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
30180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
30190 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
301a0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
301b0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
301c0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
301d0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
301e0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
301f0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
30200 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
30210 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
30220 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
30230 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
30240 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
30250 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
30260 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
30270 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
30280 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
30290 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
302a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
302b0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
302c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
302d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
302e0 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
302f0 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
30300 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
30310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30320 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
30330 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
30340 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
30350 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
30360 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
30370 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
30380 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
30390 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74  n Cell.  Write t
303a0 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c  he.** local Cell
303b0 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65   size (the numbe
303c0 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68  r of bytes on th
303d0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c  e original page,
303e0 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65   omitting.** ove
303f0 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53  rflow) into *pnS
30400 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
30410 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
30420 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
30430 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30440 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
30450 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
30460 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
30470 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
30480 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
30490 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e  ell */.  u16 *pn
304a0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
304b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
304c0 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  ize of the Cell 
304d0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  here */.){.  BtS
304e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
304f0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
30500 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
30510 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
30520 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
30530 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
30540 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
30550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30560 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
30570 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
30580 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
30590 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
305a0 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20  o);.  *pnSize = 
305b0 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66  info.nSize;.  if
305c0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
305d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
305e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
305f0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
30600 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
30610 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
30620 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
30630 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
30640 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
30650 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
30660 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
30670 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30680 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
30690 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
306a0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
306b0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
306c0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
306d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
306e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
306f0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
30700 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
30710 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
30720 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
30730 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
30740 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
30750 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
30760 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
30770 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
30780 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
30790 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
307a0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
307b0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
307c0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
307d0 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
307e0 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
307f0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
30800 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
30810 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
30820 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
30830 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
30840 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
30850 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
30860 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
30870 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
30880 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30890 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
308a0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
308b0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
308c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
308d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
308e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
308f0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
30900 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
30910 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
30920 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
30930 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
30940 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30950 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
30960 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
30970 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
30980 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
30990 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
309a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
309b0 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
309c0 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
309d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
309e0 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
309f0 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
30a00 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
30a10 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
30a20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
30a30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
30a40 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
30a50 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
30a60 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
30a70 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
30a80 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
30a90 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
30aa0 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
30ab0 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
30ac0 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
30ad0 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
30ae0 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
30af0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
30b00 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
30b10 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
30b20 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
30b30 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
30b40 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
30b50 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
30b60 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
30b70 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
30b80 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
30b90 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
30ba0 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
30bb0 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
30bc0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
30bd0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
30be0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
30bf0 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
30c00 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
30c10 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
30c20 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
30c30 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
30c40 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
30c50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
30c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
30c80 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
30c90 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
30ca0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
30cb0 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
30cc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
30cd0 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
30ce0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
30cf0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30d00 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
30d10 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
30d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
30d40 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
30d50 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
30d60 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
30d70 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
30d80 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
30d90 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
30da0 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
30db0 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
30dc0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
30dd0 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
30de0 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
30df0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
30e00 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
30e10 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
30e20 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
30e30 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
30e40 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
30e50 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
30e60 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
30e70 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
30e80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
30e90 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
30ea0 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
30eb0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
30ec0 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
30ed0 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
30ee0 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
30ef0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
30f00 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
30f10 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
30f20 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
30f30 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
30f40 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
30f50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
30f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f70 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
30f80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
30f90 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
30fa0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
30fb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
30fc0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
30fd0 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
30fe0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
30ff0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
31000 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
31010 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
31020 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
31030 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
31040 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
31050 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
31060 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
31070 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
31080 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310a0 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
310b0 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
310c0 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
310d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
310e0 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
310f0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
31100 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
31110 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
31120 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
31130 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
31140 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
31150 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31160 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
31170 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
31180 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
31190 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
311a0 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
311b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
311c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
311d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
311e0 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
311f0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
31200 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
31210 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
31220 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
31230 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
31240 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
31250 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
31260 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
31270 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
31280 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
31290 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
312a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
312b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
312c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
312d0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
312e0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
312f0 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
31300 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
31310 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
31320 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
31330 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
31340 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
31350 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
31360 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
31370 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
31380 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
31390 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
313a0 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
313b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
313c0 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d   nZero==0 );.  }
313d0 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
313e0 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
313f0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
31400 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20  &nKey);.  .  /* 
31410 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
31420 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66  oad size */.  if
31430 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
31440 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
31450 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
31460 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
31470 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
31480 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
31490 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
314a0 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
314b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
314c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
314d0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
314e0 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
314f0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
31500 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
31510 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
31520 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
31530 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
31540 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
31550 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
31560 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
31570 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
31580 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
31590 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
315a0 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
315b0 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
315c0 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
315d0 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
315e0 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
315f0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
31600 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
31610 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
31620 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
31630 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
31640 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
31650 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
31660 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
31670 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
31680 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
31690 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
316a0 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
316b0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
316c0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
316d0 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
316e0 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
316f0 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
31700 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
31710 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
31720 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
31730 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
31740 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
31750 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
31760 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
31770 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
31780 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
31790 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
317a0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
317b0 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
317c0 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
317d0 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
317e0 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
317f0 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
31800 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
31810 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31830 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
31840 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
31850 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
31860 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
31870 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
31880 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
31890 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
318a0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
318b0 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
318c0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
318d0 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
318e0 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
318f0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
31900 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
31910 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
31920 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
31930 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
31940 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
31950 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
31960 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
31970 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
31980 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
31990 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65  o info;.    btre
319a0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
319b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
319c0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
319d0 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e  nHeader=(int)(in
319e0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
319f0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
31a00 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
31a10 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
31a20 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
31a30 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
31a40 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
31a50 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
31a60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31a70 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c  pPrior == &pCell
31a80 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
31a90 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
31aa0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
31ab0 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
31ac0 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
31ad0 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
31ae0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
31af0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
31b00 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
31b10 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
31b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31b30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31b40 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
31b50 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
31b60 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
31b70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31b80 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
31b90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
31ba0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
31bb0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
31bc0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
31bd0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
31be0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
31bf0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
31c00 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
31c10 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31c20 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
31c30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
31c40 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
31c50 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
31c60 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
31c70 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
31c80 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
31c90 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
31ca0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
31cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
31cc0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
31cd0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
31ce0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
31cf0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
31d00 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
31d10 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
31d20 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
31d30 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
31d40 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
31d50 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
31d60 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
31d70 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
31d80 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
31d90 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
31da0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
31db0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
31dc0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
31dd0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
31de0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
31df0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
31e00 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
31e10 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
31e20 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
31e30 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
31e40 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
31e50 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
31e60 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
31e70 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
31e80 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
31e90 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
31ea0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
31eb0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
31ec0 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
31ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31ee0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
31ef0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
31f00 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
31f10 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
31f20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
31f30 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
31f40 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
31f50 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
31f60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31f70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31f80 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
31f90 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
31fa0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
31fb0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
31fc0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
31fd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
31fe0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
31ff0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
32000 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
32010 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
32020 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
32030 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
32040 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
32050 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
32060 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
32070 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
32080 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
32090 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
320a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
320b0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
320c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
320d0 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
320e0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
320f0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
32100 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
32110 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
32120 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
32130 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
32140 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
32150 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
32160 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
32170 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
32180 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
32190 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
321a0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
321b0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
321c0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
321d0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
321e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
321f0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
32200 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
32210 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
32220 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
32230 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
32240 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
32250 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
32260 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
32270 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
32280 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
32290 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
322a0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
322b0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
322c0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
322d0 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
322e0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
322f0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
32300 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
32310 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
32320 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
32330 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
32340 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
32350 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
32360 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
32370 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
32380 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32390 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
323a0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
323b0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
323c0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
323d0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
323e0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
323f0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
32400 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
32410 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
32420 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
32430 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
32440 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
32450 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
32460 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
32470 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32480 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32490 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
324a0 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
324b0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
324c0 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
324d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
324e0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
324f0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
32500 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
32510 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
32520 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
32530 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
32540 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
32550 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
32560 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
32570 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
32580 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
32590 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
325a0 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
325b0 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
325c0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
325d0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
325e0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
325f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
32610 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
32620 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
32630 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
32640 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
32650 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
32660 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
32670 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
32680 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
32690 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
326a0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
326b0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
326c0 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
326d0 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
326e0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
326f0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
32700 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
32710 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
32720 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32730 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
32740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
32750 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
32760 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
32770 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
32780 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
32790 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
327a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
327b0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
327c0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
327d0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
327e0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
327f0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
32800 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
32810 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
32820 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
32830 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
32840 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
32850 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
32860 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
32870 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
32880 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
32890 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
328a0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
328b0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
328c0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
328d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
328e0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
328f0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
32900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32910 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32920 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
32930 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
32940 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32950 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
32960 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
32970 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
32980 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
32990 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
329a0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
329b0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
329c0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
329d0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
329e0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
329f0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
32a00 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
32a10 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
32a20 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
32a30 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
32a40 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
32a50 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
32a60 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
32a70 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
32a80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32a90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
32aa0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
32ab0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
32ac0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
32ad0 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
32ae0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
32af0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
32b00 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
32b10 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
32b20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
32b30 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
32b40 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
32b50 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
32b60 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
32b70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
32b80 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
32b90 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
32ba0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32bb0 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
32bc0 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
32be0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
32bf0 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
32c00 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
32c10 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
32c20 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
32c30 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
32c40 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
32c50 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
32c60 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
32c70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
32c80 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
32c90 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
32ca0 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
32cb0 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
32cc0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
32cd0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
32ce0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
32cf0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
32d00 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
32d10 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
32d20 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
32d30 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
32d40 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
32d50 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
32d60 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
32d70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
32d80 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
32d90 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
32da0 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
32db0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
32dc0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
32dd0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
32de0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
32df0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
32e00 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
32e10 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
32e20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
32e30 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
32e40 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
32e50 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
32e60 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
32e70 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
32e80 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  remented..*/.sta
32e90 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
32ea0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
32eb0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
32ec0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
32ed0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
32ee0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
32ef0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
32f00 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
32f10 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
32f20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
32f30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
32f40 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
32f50 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
32f60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
32f70 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
32f80 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
32f90 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
32fa0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
32fb0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
32fc0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
32fd0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
32fe0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
32ff0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
33000 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
33010 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
33020 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
33030 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
33040 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
33050 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
33060 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
33070 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
33080 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
33090 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
330a0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
330b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
330c0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
330d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
330e0 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
330f0 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
33100 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
33110 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
33120 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
33130 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
33140 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
33150 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
33160 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
33170 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
33180 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
33190 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
331a0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
331b0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
331c0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
331d0 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ge */..  if( *pR
331e0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
331f0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
33200 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
33210 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
33220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
33230 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
33240 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
33250 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
33260 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
33270 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
33280 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
33290 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
332a0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
332b0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
332c0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
332d0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
332e0 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
332f0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
33300 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33310 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
33320 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
33330 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
33340 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
33350 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
33360 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
33370 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
33380 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
33390 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
333a0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
333b0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
333c0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
333d0 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
333e0 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
333f0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
33400 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
33410 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
33420 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
33430 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
33440 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
33450 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
33460 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
33470 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
33480 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
33490 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
334a0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
334b0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
334c0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
334d0 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
334e0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
334f0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
33500 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
33510 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
33520 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
33530 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
33540 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
33550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33560 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
33570 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
33580 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
33590 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
335a0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
335b0 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
335c0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
335d0 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
335e0 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
335f0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
33600 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
33610 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
33620 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20  l[j] = (u16)i;. 
33630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
33640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33650 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
33660 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
33670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33680 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
33690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
336a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
336b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
336c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
336d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
336e0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
336f0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
33700 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
33710 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
33720 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
33730 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
33740 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
33750 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
33760 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
33770 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
33780 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
33790 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
337a0 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
337b0 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
337c0 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
337d0 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
337e0 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
337f0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
33800 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
33810 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33820 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
33830 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
33840 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
33850 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33860 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
33870 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
33880 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
33890 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
338a0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
338b0 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
338c0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
338d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
338e0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
338f0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ld);.    }.    m
33900 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73  emmove(&data[ins
33910 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c  +2], &data[ins],
33920 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70   end-ins);.    p
33930 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
33940 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
33950 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
33960 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
33970 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
33980 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33990 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
339a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
339b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
339c0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
339d0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
339e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
339f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
33a00 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
33a10 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
33a20 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
33a30 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
33a40 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
33a50 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
33a60 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
33a70 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
33a80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
33a90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
33aa0 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
33ab0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
33ac0 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
33ad0 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
33ae0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
33af0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
33b00 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
33b10 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
33b20 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
33b30 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
33b40 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
33b50 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
33b60 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
33b70 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
33b80 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
33b90 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
33ba0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
33bb0 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
33bc0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
33bd0 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
33be0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
33bf0 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
33c00 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
33c10 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
33c20 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
33c30 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
33c40 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
33c50 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
33c60 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
33c70 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
33c80 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
33c90 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
33ca0 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
33cb0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
33cc0 61 74 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c  atic void rebuil
33cd0 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
33ce0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
33cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
33d00 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
33d10 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
33d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d30 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
33d40 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
33d50 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
33d60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
33d70 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
33d80 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
33d90 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
33da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33db0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
33dc0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
33dd0 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
33de0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
33df0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
33e00 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
33e10 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
33e20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
33e30 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
33e40 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
33e50 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
33e60 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
33e70 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
33e80 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
33e90 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
33ea0 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
33eb0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
33ec0 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
33ed0 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
33ee0 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
33ef0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
33f00 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
33f10 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
33f20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
33f30 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
33f40 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
33f50 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
33f60 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
33f70 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
33f80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
33f90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
33fa0 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
33fb0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
33fc0 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  l>aData && pCell
33fd0 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  <pEnd ){.      p
33fe0 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
33ff0 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
34000 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20   }.    pData -= 
34010 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d  szCell[i];.    m
34020 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65  emcpy(pData, pCe
34030 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a  ll, szCell[i]);.
34040 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
34050 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
34060 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
34070 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
34080 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
34090 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  ]==cellSizePtr(p
340a0 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  Pg, pCell) );.  
340b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
340c0 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
340d0 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
340e0 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
340f0 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
34100 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
34110 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
34120 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
34130 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
34140 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
34150 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
34160 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
34170 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
34180 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
34190 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
341a0 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
341b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
341c0 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
341d0 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
341e0 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
341f0 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
34200 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
34210 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
34220 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
34230 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
34240 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
34250 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
34260 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
34270 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
34280 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
34290 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
342a0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
342b0 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
342c0 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
342d0 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
342e0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
342f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
34300 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
34310 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
34320 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
34330 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
34340 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
34350 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
34360 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
34370 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
34380 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
34390 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
343a0 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
343b0 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
343c0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
343d0 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
343e0 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
343f0 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
34400 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
34410 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
34420 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
34430 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
34440 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
34450 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
34460 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
34470 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
34480 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
34490 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
344a0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
344b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
344c0 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
344d0 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
344e0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
344f0 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
34500 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
34510 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
34520 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
34530 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
34540 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
34550 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
34560 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
34570 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
34580 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
34590 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
345a0 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
345b0 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
345c0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
345d0 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
345e0 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
345f0 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
34600 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
34610 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
34620 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
34630 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
34640 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
34650 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
34660 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
34670 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
34680 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
34690 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
346a0 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
346b0 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
346c0 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
346d0 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
346e0 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
346f0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
34700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34710 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
34720 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
34730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34740 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
34750 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
34760 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
34770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34780 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
34790 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
347a0 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347c0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
347d0 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
347e0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
347f0 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
34800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34810 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
34820 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
34830 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34850 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
34860 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
34870 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
34880 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34890 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
348a0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
348b0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
348c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
348d0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
348e0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zes */.){.  int 
348f0 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
34900 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
34910 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
34920 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
34930 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74  bFreelist = aDat
34940 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d  a[1] || aData[2]
34950 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
34960 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
34970 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
34980 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
34990 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
349a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
349b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
349c0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b   sz = szCell[i];
349d0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
349e0 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
349f0 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30  if( bFreelist==0
34a00 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
34a10 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73  eFindSlot(pPg, s
34a20 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29  z, &rc, 0))==0 )
34a30 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
34a40 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
34a50 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
34a60 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
34a70 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
34a80 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53   }.    memcpy(pS
34a90 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  lot, apCell[i], 
34aa0 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
34ab0 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
34ac0 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
34ad0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
34ae0 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
34af0 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
34b00 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
34b10 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
34b20 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
34b30 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
34b40 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
34b50 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
34b60 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
34b70 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
34b80 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34b90 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
34ba0 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
34bb0 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
34bc0 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
34bd0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
34be0 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
34bf0 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
34c00 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
34c10 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
34c20 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
34c30 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
34c40 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
34c50 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
34c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
34c70 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
34c80 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
34c90 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
34ca0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
34cb0 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
34cc0 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
34cd0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
34ce0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
34cf0 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  edit */.  int nC
34d00 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
34d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
34d20 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ls to delete */.
34d30 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
34d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d50 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
34d60 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
34d70 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
34d80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
34d90 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
34da0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
34db0 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
34dc0 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
34dd0 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
34de0 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
34df0 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
34e00 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
34e10 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
34e20 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
34e30 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
34e40 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
34e50 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46   int i;.  u8 *pF
34e60 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
34e70 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
34e80 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
34e90 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
34ea0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
34eb0 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
34ec0 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c  pStart && pCell<
34ed0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
34ee0 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d  t sz = szCell[i]
34ef0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
34f00 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
34f10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
34f20 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
34f30 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
34f40 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
34f50 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
34f60 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
34f70 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
34f80 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
34f90 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
34fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
34fb0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
34fc0 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
34fd0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
34fe0 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
34ff0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
35000 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
35010 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
35020 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
35030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
35040 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
35050 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
35060 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
35070 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
35080 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
35090 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
350a0 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
350b0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
350c0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
350d0 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
350e0 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
350f0 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64  field is invalid
35100 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35110 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20  ion returns. It 
35120 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e  is the.** respon
35130 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
35140 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
35150 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
35160 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 50  tatic void editP
35170 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
35180 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
35190 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
351a0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
351b0 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20  t iOld,         
351c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
351d0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
351e0 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f  cell currently o
351f0 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  n page */.  int 
35200 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  iNew,           
35210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35220 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73  ndex of new firs
35230 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a  t cell on page *
35240 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20  /.  int nNew,   
35250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35260 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
35270 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
35280 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
35290 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
352a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
352b0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
352c0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
352d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352e0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
352f0 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35300 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
35310 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
35320 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
35330 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
35340 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20  .  u8 *pBegin = 
35350 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  &pPg->aCellIdx[n
35360 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20  New * 2];.  int 
35370 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65  nCell = pPg->nCe
35380 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  ll;       /* Cel
35390 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67  ls stored on pPg
353a0 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b   */.  u8 *pData;
353b0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
353c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
353d0 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b  iOldEnd = iOld +
353e0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50   pPg->nCell + pP
353f0 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  g->nOverflow;.  
35400 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e  int iNewEnd = iN
35410 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  ew + nNew;..#ifd
35420 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
35430 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
35440 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
35450 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
35460 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  ger);.  memcpy(p
35470 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d  Tmp, aData, pPg-
35480 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35490 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
354a0 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f  Remove cells fro
354b0 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  m the start and 
354c0 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
354d0 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e  */.  if( iOld<iN
354e0 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ew ){.    int nS
354f0 68 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41  hift = pageFreeA
35500 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35510 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61  g, iNew-iOld, &a
35520 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a  pCell[iOld], &sz
35530 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29  Cell[iOld].    )
35540 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50  ;.    memmove(pP
35550 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50  g->aCellIdx, &pP
35560 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69  g->aCellIdx[nShi
35570 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b  ft*2], nCell*2);
35580 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53  .    nCell -= nS
35590 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hift;.  }.  if( 
355a0 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e  iNewEnd < iOldEn
355b0 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d  d ){.    nCell -
355c0 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
355d0 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4f  .        pPg, iO
355e0 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26  ldEnd-iNewEnd, &
355f0 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c  apCell[iNewEnd],
35600 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64   &szCell[iNewEnd
35610 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ].    );.  }..  
35620 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b 67  pData = &aData[g
35630 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
35640 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28 20 70  dr+5])];.  if( p
35650 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 67 6f  Data<pBegin ) go
35660 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
35670 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65 6c 6c  ;..  /* Add cell
35680 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
35690 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
356a0 69 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20 29 7b  if( iNew<iOld ){
356b0 0a 20 20 20 20 69 6e 74 20 6e 41 64 64 20 3d 20  .    int nAdd = 
356c0 69 4f 6c 64 2d 69 4e 65 77 3b 0a 20 20 20 20 70  iOld-iNew;.    p
356d0 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
356e0 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d  CellIdx;.    mem
356f0 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e  move(&pCellptr[n
35700 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72  Add*2], pCellptr
35710 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20  , nCell*2);.    
35720 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
35730 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 70  ray(.          p
35740 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
35750 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
35760 20 20 20 20 20 20 20 20 6e 41 64 64 2c 20 26 61          nAdd, &a
35770 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a  pCell[iNew], &sz
35780 43 65 6c 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29  Cell[iNew].    )
35790 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
357a0 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c  _fail;.    nCell
357b0 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20   += nAdd;.  }.. 
357c0 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72   /* Add any over
357d0 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  flow cells */.  
357e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e  for(i=0; i<pPg->
357f0 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b  nOverflow; i++){
35800 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d  .    int iCell =
35810 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69   (iOld + pPg->ai
35820 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b  Ovfl[i]) - iNew;
35830 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d  .    if( iCell>=
35840 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20  0 && iCell<nNew 
35850 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74  ){.      pCellpt
35860 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
35870 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20  dx[iCell * 2];. 
35880 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43       memmove(&pC
35890 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c  ellptr[2], pCell
358a0 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43  ptr, (nCell - iC
358b0 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20  ell) * 2);.     
358c0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
358d0 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
358e0 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  ray(.           
358f0 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
35900 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
35910 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 26              1, &
35920 61 70 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69  apCell[iCell + i
35930 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43  New], &szCell[iC
35940 65 6c 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20  ell + iNew].    
35950 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
35960 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a  age_fail;.    }.
35970 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
35980 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e   cells to the en
35990 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
359a0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
359b0 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  Pg->aCellIdx[nCe
359c0 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67  ll*2];.  if( pag
359d0 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
359e0 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
359f0 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
35a00 70 74 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65  ptr,.        nNe
35a10 77 2d 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c  w-nCell, &apCell
35a20 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73  [iNew+nCell], &s
35a30 7a 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c  zCell[iNew+nCell
35a40 5d 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69  ].  ) ) goto edi
35a50 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70  tpage_fail;..  p
35a60 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77  Pg->nCell = nNew
35a70 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
35a80 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
35a90 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
35aa0 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
35ab0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
35ac0 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
35ad0 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65  - aData);..#ifde
35ae0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
35af0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
35b00 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b   && !CORRUPT_DB;
35b10 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
35b20 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b  Cell = apCell[i+
35b30 69 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69  iNew];.    int i
35b40 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65 28 26  Off = get2byte(&
35b50 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a  pPg->aCellIdx[i*
35b60 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65  2]);.    if( pCe
35b70 6c 6c 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65  ll>=aData && pCe
35b80 6c 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70  ll<&aData[pPg->p
35b90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
35ba0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  ){.      pCell =
35bb0 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61   &pTmp[pCell - a
35bc0 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Data];.    }.   
35bd0 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
35be0 6d 70 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61  mp(pCell, &aData
35bf0 5b 69 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69  [iOff], szCell[i
35c00 2b 69 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23  +iNew]) );.  }.#
35c10 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b  endif..  return;
35c20 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a  . editpage_fail:
35c30 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  .  /* Unable to 
35c40 65 64 69 74 20 74 68 69 73 20 70 61 67 65 2e 20  edit this page. 
35c50 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20  Rebuild it from 
35c60 73 63 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e  scratch instead.
35c70 20 2a 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67   */.  rebuildPag
35c80 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70  e(pPg, nNew, &ap
35c90 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43  Cell[iNew], &szC
35ca0 65 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f  ell[iNew]);.}../
35cb0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
35cc0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
35cd0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
35ce0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
35cf0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
35d00 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
35d10 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
35d20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
35d30 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
35d40 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
35d50 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
35d60 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
35d70 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
35d80 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
35d90 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
35da0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
35db0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
35dc0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
35dd0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
35de0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
35df0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
35e00 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
35e10 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
35e20 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
35e30 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
35e40 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
35e50 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
35e60 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
35e70 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
35e80 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
35e90 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
35ea0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
35eb0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
35ec0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
35ed0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
35ee0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
35ef0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
35f00 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
35f10 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
35f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35f30 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
35f40 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
35f50 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
35f60 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
35f70 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
35f80 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
35f90 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
35fa0 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
35fb0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
35fc0 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
35fd0 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
35fe0 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
35ff0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
36000 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
36010 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
36020 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
36030 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
36040 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
36050 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
36060 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
36070 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
36080 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
36090 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
360a0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
360b0 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
360c0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
360d0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
360e0 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
360f0 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
36100 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
36110 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
36120 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
36130 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
36140 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
36150 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
36160 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
36170 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
36180 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
36190 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
361a0 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
361b0 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
361c0 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
361d0 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
361e0 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
361f0 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
36200 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
36210 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
36220 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
36230 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
36240 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
36250 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
36260 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
36270 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
36280 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
36290 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
362a0 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
362b0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
362c0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
362d0 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
362e0 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
362f0 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
36300 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
36310 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
36320 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
36330 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
36340 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
36350 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
36360 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
36370 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
36380 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
36390 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
363a0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
363b0 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
363c0 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
363d0 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
363e0 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
363f0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
36400 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
36410 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
36420 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
36430 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
36440 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
36450 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
36460 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
36470 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
36480 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
36490 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
364a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
364b0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
364c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
364f0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
36500 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
36510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36520 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36530 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
36540 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36550 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
36560 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
36570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
36580 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36590 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
365a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
365b0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
365c0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
365d0 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
365e0 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
365f0 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
36600 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
36610 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
36620 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20  age->nCell==0 ) 
36630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
36640 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
36650 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
36660 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
36670 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
36680 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
36690 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
366a0 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
366b0 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
366c0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
366d0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
366e0 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
366f0 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
36700 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
36710 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
36720 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
36730 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
36740 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
36750 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
36760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36770 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
36780 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
36790 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
367a0 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  = pPage->apOvfl[
367b0 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  0];.    u16 szCe
367c0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
367d0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
367e0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
367f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
36800 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36810 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
36820 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
36830 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
36840 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
36850 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
36860 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
36870 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
36880 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
36890 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
368a0 20 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70     rebuildPage(p
368b0 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
368c0 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e  &szCell);.    pN
368d0 65 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ew->nFree = pBt-
368e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e  >usableSize - pN
368f0 65 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d  ew->cellOffset -
36900 20 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20   2 - szCell;..  
36910 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
36920 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
36930 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
36940 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
36950 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
36960 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
36970 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
36980 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
36990 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
369a0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
369b0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
369c0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
369d0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
369e0 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
369f0 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
36a00 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
36a10 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
36a20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
36a30 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
36a40 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
36a50 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
36a60 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
36a70 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
36a80 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
36a90 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
36aa0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
36ab0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
36ac0 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
36ad0 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
36ae0 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
36af0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
36b00 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
36b10 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
36b20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
36b30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
36b40 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
36b50 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
36b60 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
36b70 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
36b80 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
36b90 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
36ba0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
36bb0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
36bc0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
36bd0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
36be0 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
36bf0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
36c00 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
36c10 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
36c20 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
36c30 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
36c40 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
36c50 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
36c60 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
36c70 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
36c80 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
36c90 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
36ca0 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
36cb0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
36cc0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
36cd0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
36ce0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
36cf0 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
36d00 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
36d10 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
36d20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
36d30 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
36d40 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
36d50 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
36d60 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
36d70 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
36d80 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
36d90 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
36da0 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
36db0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
36dc0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
36dd0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
36de0 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
36df0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
36e00 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
36e10 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
36e20 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
36e30 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
36e40 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
36e50 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
36e60 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
36e70 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
36e80 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
36e90 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
36ea0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
36eb0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
36ec0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
36ed0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
36ee0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
36ef0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
36f00 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
36f10 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
36f20 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
36f30 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
36f40 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
36f50 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
36f60 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
36f70 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
36f80 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
36f90 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
36fa0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
36fb0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
36fc0 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
36fd0 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
36fe0 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
36ff0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
37000 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
37010 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
37020 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
37030 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
37040 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
37050 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
37060 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
37070 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
37080 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
37090 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
370a0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
370b0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
370c0 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
370d0 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
370e0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
370f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
37100 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
37110 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
37120 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
37130 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37140 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
37150 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
37160 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
37170 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
37180 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
37190 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
371a0 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
371b0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
371c0 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
371d0 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
371e0 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
371f0 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
37200 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
37210 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
37220 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
37230 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
37240 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
37250 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
37260 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
37270 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
37280 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
37290 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
372a0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
372b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
372c0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
372d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
372e0 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
372f0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
37300 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
37310 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
37320 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
37330 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
37340 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
37350 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
37360 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
37370 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
37380 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
37390 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
373a0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
373b0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
373c0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
373d0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
373e0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
373f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
37400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37410 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
37420 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
37430 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
37440 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
37450 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
37460 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
37470 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
37480 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
37490 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
374a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
374b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
374c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
374d0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
374e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
374f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
37500 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
37510 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
37520 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
37530 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
37540 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
37550 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
37560 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
37570 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
37580 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37590 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
375a0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
375b0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
375c0 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
375d0 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
375e0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
375f0 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
37600 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
37610 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
37620 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
37630 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
37640 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
37650 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
37660 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
37670 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
37680 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
37690 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
376a0 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
376b0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
376c0 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
376d0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
376e0 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
376f0 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
37700 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
37710 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
37720 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
37730 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
37740 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
37750 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
37760 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
37770 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
37780 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61  ge.apOvfl[] arra
37790 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
377a0 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
377b0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
377c0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
377d0 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
377e0 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
377f0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
37800 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
37810 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
37820 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
37830 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
37840 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
37850 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
37860 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
37870 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
37880 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
37890 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
378a0 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
378b0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
378c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
378d0 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
378e0 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
378f0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
37900 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
37910 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
37920 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
37930 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
37940 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
37950 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
37960 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
37970 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
37980 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
37990 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
379a0 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
379b0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
379c0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
379d0 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
379e0 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
379f0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
37a00 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
37a10 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
37a20 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
37a30 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
37a40 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
37a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
37a60 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
37a70 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
37a80 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
37a90 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
37aa0 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
37ab0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
37ac0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
37ad0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
37ae0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
37af0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
37b00 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
37b10 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
37b20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
37b30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
37b40 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
37b50 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
37b60 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
37b70 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
37b80 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
37b90 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
37ba0 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
37bb0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
37bc0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
37bd0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
37be0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
37bf0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
37c00 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
37c10 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
37c20 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
37c30 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
37c40 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
37c50 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
37c60 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
37c70 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
37c80 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
37c90 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
37ca0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
37cb0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
37cc0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
37cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37ce0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
37cf0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
37d00 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
37d10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
37d20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
37d30 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
37d40 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
37d50 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
37d60 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
37d70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
37d80 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
37d90 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
37da0 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
37db0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
37dc0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
37dd0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
37de0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
37df0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
37e00 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
37e10 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
37e20 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
37e30 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
37e40 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
37e50 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
37e60 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
37e70 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
37e80 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
37e90 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
37ea0 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
37eb0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
37ec0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
37ed0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
37ee0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
37ef0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
37f00 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
37f10 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
37f20 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
37f30 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
37f40 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
37f50 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
37f60 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
37f70 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
37f80 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
37f90 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
37fa0 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
37fb0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
37fc0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
37fd0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
37fe0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
37ff0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
38000 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
38010 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
38020 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
38030 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
38040 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
38050 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
38060 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
38070 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
38080 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
38090 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
380a0 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
380b0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
380c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
380d0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
380e0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
380f0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
38100 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
38110 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
38120 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
38130 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
38140 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
38150 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
38160 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
38170 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
38180 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
38190 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
381a0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
381b0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
381c0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
381d0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
381e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
381f0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
38200 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
38210 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
38220 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
38230 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
38240 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
38250 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
38260 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
38270 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
38280 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
38290 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
382a0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
382b0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
382c0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
382d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
382e0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
382f0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
38300 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
38310 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
38320 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
38330 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
38340 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
38350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
38360 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
38370 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
38380 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
38390 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
383a0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
383b0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
383c0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
383d0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
383e0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
383f0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
38400 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
38410 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
38420 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
38430 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
38440 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
38450 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
38460 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
38470 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
38480 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
38490 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 7